登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-13 09:48:35 323浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《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])
}

解决方案


在函数声明结束后引用 a 是安全的,因为 go 会进行转义分析。如果编译器可以证明它可以安全访问,则将其放入堆栈,如果不能,则将其分配在堆上。

构建标志可以让您深入了解逃逸分析:

go build -gcflags "-m" main.go

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

这可能会有所帮助:Allocation efficiency

此外,由于切片很小:指针、长度和容量,因此不太常见到切片的指针。请参阅 slice internals

到这里,我们也就讲完了《Go 中作为指针附加的局部变量的生命周期》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>