Указатель возврата на локальную структуру

85

Я вижу несколько примеров кода с такими конструкциями:

type point struct {
  x, y int
}

func newPoint() *point {
  return &point{10, 20}
}

У меня есть опыт работы с C ++, и мне кажется, что это ошибка. Какова семантика такой конструкции? Выделена новая точка в стеке или куче?

Деми
источник
1
Аналогичный вопрос (ответ ссылается на документацию): stackoverflow.com/questions/12098435/…
Дени Сегур
@ DenysSéguret, это не похоже
mangusta

Ответы:

109

Go выполняет анализ выхода указателя. Если указатель выходит из локального стека, что происходит в этом случае, объект размещается в куче. Если он не экранирует локальную функцию, компилятор может разместить его в стеке (хотя он не дает никаких гарантий; это зависит от того, может ли анализ выхода указателя доказать, что указатель остается локальным для этой функции).

Лили Баллард
источник
13
Вот пост в блоге (отказ от ответственности: который я написал), в котором более подробно рассматривается
scvalex
@LilyBallard не получила ответа полностью. Вы имеете в виду, что доказать факт экранирования указателя всегда возможно, а доказать факт НЕ экранирования - нет?
мангуста
18

Документация Golang утверждает, что совершенно законно возвращать указатель на локальную переменную. Как я читаю здесь

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/EYUuead0LsY

Похоже, компилятор видит, что вы возвращаете адрес, и просто помещает его в кучу для вас. Это обычная идиома в Go.

Masebase
источник