這是一個菜鳥問題,請多多包涵。所以問題是為什么 f() 函數指向不同的地址。我的理解是變量 v 必須覆蓋舊值。package mainimport "fmt"var p = f()func f() *int { v := 1 return &v}func main() { fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(p)}//0xc0000140b0//0xc0000140b8//0xc0000140e0//0xc000014098
2 回答

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
給這個簡單的答案
Go 查找比當前堆棧幀壽命更長的變量,然后堆分配它們
基本上,變量 v 轉義了函數 f 堆棧幀并在堆中分配,這就是為什么您每次都會看到不同的地址打印的原因。
閱讀這篇關于逃逸分析的精彩介紹。https://medium.com/a-journey-with-go/go-introduction-to-the-escape-analysis-f7610174e890
嘗試運行逃逸分析以查看所有逃逸的變量。
go build -gcflags="-m" main.go:
./main.go:7:2: moved to heap: v //points to v := 1
./main.go:12:15: moved to heap: v //points to fmt.Println(f())
./main.go:13:15: moved to heap: v //points to fmt.Println(f())
./main.go:14:15: moved to heap: v //points to fmt.Println(f())
請注意,最后一條fmt.Println(f())語句不考慮轉義,因為傳遞給 Println 的值p是全局變量,因此它已經在堆中,因此不需要escape.
- 2 回答
- 0 關注
- 84 瀏覽
添加回答
舉報
0/150
提交
取消