Devuelve el puntero a la estructura local

85

Veo algunos ejemplos de código con construcciones como esta:

type point struct {
  x, y int
}

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

Tengo experiencia en C ++ y me parece un error. ¿Cuál es la semántica de tal construcción? ¿Se asignan nuevos puntos en la pila o en el montón?

demi
fuente
1
Una pregunta similar (la respuesta enlaza con la documentación): stackoverflow.com/questions/12098435/…
Denys Séguret
@ DenysSéguret no es similar
mangusta

Respuestas:

109

Go realiza un análisis de escape del puntero. Si el puntero escapa de la pila local, lo que hace en este caso, el objeto se asigna en el montón. Si no escapa de la función local, el compilador es libre de asignarlo a la pila (aunque no ofrece garantías; depende de si el análisis de escape del puntero puede probar que el puntero permanece local a esta función).

Lily Ballard
fuente
13
Aquí hay una publicación de blog (descargo de responsabilidad: que escribí) que analiza el análisis de escape de Go un poco más de cerca: scvalex.net/posts/29
scvalex
@LilyBallard no obtuvo una respuesta completa. ¿Quiere decir que probar el hecho de escapar del puntero siempre es posible, mientras que probar el hecho de NO escapar no lo es?
mangusta