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


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.