Go Компилятор выполняет Escape-анализ для переменных и решает, размещать их в стеке или в куче. В вашем примере point
возвращает адрес y
, поэтому y
экранирует point
. Из-за этого y
выделяется в куче, а не в стеке.
В отличие от C / C ++, вполне нормально возвращать переменные стека из функций. Многие функции, подобные конструкторам, записываются в виде:
func NewStruct() *Struct {
return &Struct{}
}
Это распределяет структуру в куче и возвращает указатель на нее.