为了账号安全,请及时绑定邮箱和手机立即绑定

即使函数已在 golang 中返回,我是否可以使用 & 运算符来获取函数中的有效指针

即使函数已在 golang 中返回,我是否可以使用 & 运算符来获取函数中的有效指针

Go
梵蒂冈之花 2021-11-15 16:43:43
一些代码如下type TUser struct {    Name    string    Addr    string}var UserMap map[int]*TUser  //save TUser pointer to mapfunc LoadUsers() {    ... ...    //assume "row" contains the results of table "users" from db    UserMap[0] = &TUser{Name:row["name"], Addr:row["addr"]}}我的问题是:函数“LoadUsers”返回后,“UserMap[0]”中的指针有效吗?或者它会变成一个野指针,就像我们在 C 语言中做同样的事情一样?
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

是的,这是完全有效的

常见问题

我怎么知道一个变量是分配在堆上还是堆栈上?

从正确性的角度来看,您不需要知道。只要有对它的引用,Go 中的每个变量就存在。实现选择的存储位置与语言的语义无关。

存储位置确实对编写高效程序有影响。如果可能,Go 编译器将在该函数的堆栈帧中分配函数的局部变量。但是,如果编译器在函数返回后无法证明该变量未被引用,则编译器必须在垃圾收集堆上分配该变量以避免悬空指针错误。此外,如果局部变量非常大,将其存储在堆上而不是堆栈上可能更有意义。

在当前的编译器中,如果一个变量的地址被占用,则该变量是在堆上分配的候选对象。然而,一个基本的逃逸分析识别出一些情况,当这些变量在函数返回后不会存活并且可以驻留在堆栈中。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信