Что выведет этот код?
package main
import "fmt"
type Config struct {
Timeout *int
}
func main() {
a := Config{
Timeout: new(30),
}
b := a
*b.Timeout = 60
c := Config{
Timeout: new(*a.Timeout),
}
*c.Timeout = 90
fmt.Println(
*a.Timeout,
*b.Timeout,
*c.Timeout,
)
}
Попробуйте определить ответ до запуска.
```text
60 60 90
```
Почему?
```go
b := a
```
Структура копируется, но указатель внутри неё остаётся тем же. Поэтому `a.Timeout` и `b.Timeout` указывают на одну переменную:
```go
*b.Timeout = 60
```
Изменение видно через обе структуры.
А здесь создаётся уже новая переменная:
```go
Timeout: new(*a.Timeout)
```
Go сначала получает значение `60`, затем выделяет для него отдельную память. Поэтому изменение `c.Timeout` не влияет на `a` и `b`.
```text
a ─┐
├──► 60
b ─┘
c ─────► 90
```
Это важный нюанс: копирование структуры с указателями, слайсами или map не создаёт глубокую копию данных.
Синтаксис `new(30)` появился в **Go 1.26**. Раньше `new` принимал только тип, а теперь может сразу создать указатель на переданное значение.
Код актуален для последней стабильной версии **Go 1.26.5**.
#Golang #Go126 #Programming