一些代码如下
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语言中做同样的事情一样?
谢谢
是的,这是完全有效的
来自FAQ:
我如何知道变量是在堆还是堆栈上分配?
从正确的角度来看,您不需要知道.Go中的每个变量都存在,只要有对它的引用即可.实现选择的存储位置与语言的语义无关.
存储位置确实会影响编写高效的程序.如果可能,Go编译器将为该函数的堆栈帧中的函数分配本地变量.但是,如果编译器在函数返回后无法证明变量未被引用,则编译器必须在垃圾收集堆上分配变量以避免悬空指针错误.此外,如果局部变量非常大,将它存储在堆而不是堆栈上可能更有意义.
在当前的编译器中,如果变量具有其地址,则该变量是堆上分配的候选变量.但是,基本的转义分析可以识别某些情况,这些变量不会超过函数的返回值并且可以驻留在堆栈上.