Zeiger auf lokale Struktur zurückgeben

85

Ich sehe einige Codebeispiele mit Konstrukten wie diesem:

type point struct {
  x, y int
}

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

Ich habe C ++ - Hintergrund und es scheint mir ein Fehler zu sein. Was ist die Semantik eines solchen Konstrukts? Wird auf dem Stapel oder Heap ein neuer Punkt zugewiesen?

demi
quelle
1
Eine ähnliche Frage (die Antwort verweist
Denys Séguret
@ DenysSéguret es ist nicht ähnlich
Mangusta

Antworten:

109

Go führt eine Zeiger-Escape-Analyse durch. Wenn der Zeiger dem lokalen Stapel entgeht, was in diesem Fall der Fall ist, wird das Objekt auf dem Heap zugewiesen. Wenn es der lokalen Funktion nicht entgeht, kann der Compiler es dem Stapel zuordnen (obwohl es keine Garantien gibt; es hängt davon ab, ob die Zeiger-Escape-Analyse beweisen kann, dass der Zeiger für diese Funktion lokal bleibt).

Lily Ballard
quelle
13
Hier ist ein Blogpost (Haftungsausschluss: den ich geschrieben habe), der Go's Fluchtanalyse etwas genauer untersucht: scvalex.net/posts/29
scvalex
@ LilyBallard hat Ihre Antwort nicht vollständig erhalten. Sie meinen, dass es immer möglich ist, die Tatsache zu beweisen, dass der Zeiger entkommen ist, während dies nicht der Fall ist?
Mangusta
18

Die Golang "Dokumentation besagt, dass es vollkommen legal ist, einen Zeiger auf eine lokale Variable zurückzugeben." Wie ich hier lese

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

Ich sehe so aus, als ob der Compiler sieht, dass Sie die Adresse zurückgeben und sie nur für Sie auf dem Heap machen. Dies ist eine gängige Redewendung in Go.

masebase
quelle