Widzę przykłady kodu z takimi konstrukcjami:
type point struct {
x, y int
}
func newPoint() *point {
return &point{10, 20}
}
Mam tło C ++ i wydaje mi się, że to błąd. Jaka jest semantyka takiej konstrukcji? Czy nowy punkt jest przydzielany na stosie lub stercie?
Odpowiedzi:
Go wykonuje analizę ucieczki wskaźnika. Jeśli wskaźnik ucieka ze stosu lokalnego, co robi w tym przypadku, obiekt jest alokowany na stercie. Jeśli nie ucieknie przed funkcją lokalną, kompilator może przydzielić ją na stosie (chociaż nie daje żadnych gwarancji; zależy to od tego, czy analiza ucieczki wskaźnika może udowodnić, że wskaźnik pozostaje lokalny dla tej funkcji).
źródło
Golang „Dokumentacja stwierdza, że zwrócenie wskaźnika do zmiennej lokalnej jest całkowicie legalne”. Jak czytam tutaj
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/EYUuead0LsY
Wygląda na to, że kompilator widzi, że zwracasz adres i po prostu umieszcza go na stosie. To popularny idiom w Go.
źródło