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

dda*_*dca 3 c pointers go

一些代码如下

type TUser struct {
    Name    string
    Addr    string
}

var UserMap map[int]*TUser  //save TUser pointer to map

func LoadUsers() {

    ... ...
    //assume "row" contains the results of table "users" from db
    UserMap[0] = &TUser{Name:row["name"], Addr:row["addr"]}
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:在"LoadUsers"函数返回后,"UserMap [0]"中的指针是否有效?或者它会变成一个狂野的指针,就像我们在C语言中做同样的事情一样?

谢谢

Den*_*ret 6

是的,这是完全有效的

来自FAQ:

我如何知道变量是在堆还是堆栈上分配?

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

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

在当前的编译器中,如果变量具有其地址,则该变量是堆上分配的候选变量.但是,基本的转义分析可以识别某些情况,这些变量不会超过函数的返回值并且可以驻留在堆栈上.