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

我正在学习 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])

}


繁花不似锦
浏览 133回答 1
1回答

撒科打诨

在声明它的函数结束后引用它是安全a的,因为 go 会进行逃逸分析。如果编译器可以证明它可以安全访问,则将其放入堆栈,如果不能,则将其分配到堆上。构建标志可以对逃逸分析提供一些见解:go build -gcflags "-m" main.go..../main.go:10:2: moved to heap: a...这可能会有所帮助:分配效率。此外,由于切片很小,因此很少看到指向切片的指针:指针、长度和容量。请参阅切片内部。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go