В Embedii.Do()
получатель является значением указателя. Это копия. Присвоение чего-либо этой переменной указателя просто изменяет копию.
y = new(Embedii)
просто назначает указатель на локальную переменную y
, а когда Do()
возвращается, оно теряется. При повторном вызове y
будет снова nil
, поэтому он создает и присваивает ему новое значение (которое снова будет потеряно после возврата).
Работает, если вы создаете Embedii
до потому что тогда вы не создадите и не назначите его в Do()
(что будет потеряно).
Если вы вернете новый Embedii
(точнее, его адрес) и назначите его, вы увидите его увеличивается, но начинается с 0
, а не 1
, потому что первый вызов просто создает его без увеличения, а в других случаях он уже существовал, и поэтому первый вызов увеличивается сразу:
func (y *Embedii) Do() *Embedii {
if y == nil {
y = new(Embedii)
} else {
*y = *y + 1
}
fmt.Println(*y)
return y
}
И используя его:
embedder := new(Embedder)
embedder.Embedii = embedder.Do() // prints 0
embedder.Embedii = embedder.Do() // prints 1
Вывод будет (попробуйте на Go Playground ):
1
2
---
0
1
---
1
2