Go, кажется, не передает указатели, как я думаю, что это - PullRequest
0 голосов
/ 04 января 2019

У меня есть программа Go, которую я использую, чтобы проверить ошибку указателя, которую я имею в гораздо более крупной программе службы http.

У меня есть указатель структуры, которую я хочу передать функции для ее инициализации. Естественно, потому что это указатель, мне не нужно ничего возвращать. Это должно изменить это непосредственно.

Однако, это не то, что здесь происходит.

func main () {
   var thing *Thing
   ModifyThing(thing)
   fmt.Println(thing)
}

func ModifyThing (thing *Thing) {
   thing = NewThing()
}

func NewThing () *Thing {
   thing := Thing{}
   return &thing
}

/// Output: <nil>

Если я использую NewThing() на своем thing напрямую, я получу инициализированный указатель. Однако это не работает, когда я передаю указатель на функцию, которая вызывает тот же метод. Память моего thing не передается так, как я ожидаю?

1 Ответ

0 голосов
/ 04 января 2019

Ваш ModifyThing фактически не изменяет thing. Он перезаписывает свою локальную переменную thing новым указателем на новый экземпляр Thing, поэтому он ни на что не влияет. Если он действительно изменен thing - скажем, thing.field = newValue, это будет отражено в вызывающем абоненте.

Если вы хотите перезаписать все значение, на которое указывает указатель, вы также можете сделать это, но вы должны явно перезаписать память, на которую указывает , а не сам указатель:

*thing = Thing{}

Обратите внимание, что мы разыменовываем *thing и перезаписываем его значение новым Thing (не новым *Thing!)

Все в Go передается по значению, включая указатели . Указатели указывают на адрес памяти, который может быть общим значением. Но сам указатель все еще копируется при вызове функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...