Помните, все в Go передается значением .Когда вы передаете указатель, вы передаете указатель по значению.Ваш аргумент функции - это новая локальная переменная с тем же значением, которое было передано ей вызывающей стороной;т.е. новый указатель, который указывает на то же место в памяти.Итак, ваш код:
func initApp(x *ClassX) {
tmp := NewClassXObject()
x = tmp
fmt.Println("tmp:", tmp)
fmt.Println("x:", x)
}
Создает новый *ClassX
в tmp
, затем перезаписывает x
новым указателем на новую ячейку памяти, а затем возвращает.Ничто из этого не имеет никакого влияния на область действия вызывающего абонента;указатель, переданный вызывающим абонентом, все еще указывает на тот же адрес памяти, что и раньше.Вы можете изменить значение, на которое указывает x
:
func initApp(x *ClassX) {
tmp := NewClassXObject()
*x = *tmp
fmt.Println("tmp:", tmp)
fmt.Println("x:", x)
}
Теперь у вас есть два указателя на две отдельные области памяти, и вы копируете значение, на которое указывает один, в память, на которое указывает другой, так что они оба указывают на два одинаковых значения в двух разных местах памяти.Это то, что вы должны сделать, если хотите перезаписать значение, на которое указывает вызывающий объект.
Однако, поскольку это создает новое значение, вероятно, вам нужно не перезаписать значение вызывающего, авернуть новое значение.Использование указателей в качестве «выходных параметров» очень и очень ограничено в Go;поскольку вы можете возвращать несколько значений, вы почти всегда просто хотите вернуть значение, а не обновлять аргумент указателя:
func initApp() *ClassX {
return NewClassXObject()
}
func main() {
var obj = initApp()
fmt.Println(obj)
}