Вернуть указатель на локальную структуру
Я вижу несколько примеров кода с такими конструкциями:
type point struct {
x, y int
}
func newPoint() *point {
return &point{10, 20}
}
У меня есть фон С++, и для меня это похоже на ошибку. Какова семантика такой конструкции? Новая точка выделена в стек или куча?
Ответы
Ответ 1
Go выполняет анализ escape-указателя. Если указатель выходит из локального стека, который он делает в этом случае, объект выделяется в куче. Если он не скрывает локальную функцию, компилятор может свободно выделять его в стеке (хотя он не дает никаких гарантий, это зависит от того, может ли анализ escape-кода указателем остаться в этом месте).
Ответ 2
Документация "Голанг" гласит, что совершенно законно возвращать указатель на локальную переменную ". Поскольку я читаю здесь
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/EYUuead0LsY
Мне кажется, что компилятор видит, что вы возвращаете адрес и просто забираете его в кучу. Это общая идиома в Go.