我正在學習 Go 并且有 C/C++ 背景。在下面的示例中,將地址附加a到切片中是否安全?當我運行此示例時,2會打印正確的值 ( ),但需要確定一下。如果這是錯誤的,我該怎么做?func add(mapping map[string]*[]*int) { sliceptr := &[]*int{} mapping["foo"] = sliceptr ele := mapping["foo"] a := 2 // won't address of `a` go out of scope? ele2 := append(*ele, &a) mapping["foo"] = &ele2}func main() { mapping := map[string]*[]*int{} add(mapping) fmt.Println(*(*mapping["foo"])[0])}
1 回答

撒科打諢
TA貢獻1934條經驗 獲得超2個贊
在聲明它的函數結束后引用它是安全a的,因為 go 會進行逃逸分析。如果編譯器可以證明它可以安全訪問,則將其放入堆棧,如果不能,則將其分配到堆上。
構建標志可以對逃逸分析提供一些見解:
go build -gcflags "-m" main.go
...
./main.go:10:2: moved to heap: a
...
這可能會有所幫助:分配效率。
此外,由于切片很小,因此很少看到指向切片的指針:指針、長度和容量。請參閱切片內部。
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消