处理悬摆指针在Go
问题描述:
我一直在阅读锈蚀和并行去,我看到这两种语言如何对待悬摆指针,它会导致问题的细微差别。例如,这里是防锈版本:处理悬摆指针在Go
fn main() {
let reference_to_nothing = dangle();
}
fn dangle() -> &String {
let s = String::from("hello");
&s
}
以上会报错了说,在功能dangle
,s
超出范围,我可以参考不回了!但是在Go中,这似乎是允许的?
如何像这样的东西去处理?在Go中创建悬挂指针很容易吗?如果有,我有什么措施来控制它们?
答
在围棋,悬摆指针是没有的事,因为如何escape analysis的工作方式。假设你有这样的代码:
func CreateUser(name string) *User {
return &User{Name: name}
}
编译器会明白,因为指针可以在函数退出之后访问,结构应在堆中分配。由于Effective Go说:
请注意,不像在C中,它是完全可以返回一个局部变量的地址;与该变量相关的存储在函数返回后仍然存在。