Функции Go со смешанными типами возврата / подписи - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь выяснить, как работают указатели в Go, и я думаю, что начинаю понимать это, но это сбивает меня с толку, и я действительно не знаю, что искать.Допустим, у меня есть следующая функция:

func createNode(nodeInfo string) *TreeNode {
    return &TreeNode{info: nodeInfo}
}

Я понимаю, что функция возвращает адрес памяти созданного экземпляра структуры, но как сигнатура функции говорит *TreeNode?Насколько я понимаю, * используется для разыменования указателей для получения самого значения, так что же здесь происходит?

Также здесь:

 func zero(xPtr *int) {
  *xPtr = 0
}

func main() {
  x := 5
  zero(&x)
}

Когда происходит обратноефункция принимает аргумент с оператором *, но сама функция вызывается с оператором &.

1 Ответ

0 голосов
/ 20 сентября 2018

* имеет 2 использования, одно для переменных и одно для типов:

  • Для типов это означает, что тип является указателем, а не значением напрямую.
  • Для переменных он разыменовывает указатель, как вы уже знаете.(Можно также различить это использование на два «подиспользования», так как * в левой части назначений, как в *ptr = val устанавливает значение, на которое указывает указатель, в то время как * обычно «извлекает»значение, на которое указывает указатель.)

&, с другой стороны, может использоваться только для переменных и получает адрес объекта в памяти.

В ваших примерахвозвращаемый тип *TreeNode и аргумент тип *int означают, что вы возвращаете / ожидаете указатель в соответствии с использованием для типов .В отличие от этого, *xPtr = 0 разыменовывает переменную xPtr.

Чтобы узнать, какое использование является правильным в вашей ситуации, вы должны четко указать себе, имеете ли вы дело с типомили переменная.

Техническое описание можно прочитать в разделах языковых спецификаций на Типы указателей и Операторы адреса .

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