gpt4 book ai didi

go - 在Go中附加为指针的局部变量的生命周期

转载 作者:行者123 更新时间:2023-12-01 20:27:11 33 4
gpt4 key购买 nike

我正在学习Go,并且具有C/C++背景。在以下示例中,将a的地址附加到slice中是否安全?当我运行此示例时,将打印正确的值(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])
}

最佳答案

函数声明结束后,可以安全地引用a,因为go会进行转义分析。如果编译器可以证明可以安全地对其进行访问,则将其放入堆栈中;否则,将其分配到堆中。

构建标志可以使您更深入地了解转义分析:
go build -gcflags "-m" main.go

...
./main.go:10:2: moved to heap: a
...

这可能会有所帮助: Allocation efficiency

此外,由于 slice 很小:指针,长度和容量,所以很少看到指向 slice 的指针。参见 slice internals

关于go - 在Go中附加为指针的局部变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806711/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com