Ключевым моментом, который следует помнить, является то, что все передается по значению (то есть, копируется).Когда вы передаете указатель на функцию, этот параметр является все еще локальной переменной в этой функции, содержащей копию указателя .Эта локальная копия указывает на ту же память, на которую ссылается вызывающая сторона.
Когда вы делаете это:
v = &User{Name: "Paul"}
Вы перезаписываете свою локальную переменную v
новый указатель на новый экземпляр User
.Теперь он указывает на память, отличную от указателя вызывающего, поэтому вызывающий ничего не видит.
Если вы вместо этого сделали это:
*v = User{Name: "Paul"}
Затем указатель тот же , указывающийв ту же память, будет перезаписан новым экземпляром User
.
Аналогично, в Modify3
у вас есть указатель науказатель .Таким образом, у вашего вызывающего и функции есть локальная переменная, которая указывает на область памяти, которая содержит другую область памяти, где можно найти фактическое значение.Обратите внимание, что это очень необычный (но не неслыханный) шаблон в Go, но распространенный в других языках.Когда вы делаете это:
*y = &User{Name: "Bob"}
Вы создаете новый указатель на новый User
и сохраняете этот новый указатель в общей памяти, на которую указывает внешний указатель.Итак, опять же, и функция, и вызывающая сторона делят память, и оба увидят изменения.