处理悬摆指针在Go

问题描述:

我一直在阅读锈蚀和并行去,我看到这两种语言如何对待悬摆指针,它会导致问题的细微差别。例如,这里是防锈版本:处理悬摆指针在Go

fn main() { 
    let reference_to_nothing = dangle(); 
} 

fn dangle() -> &String { 
    let s = String::from("hello"); 

    &s 
} 

以上会报错了说,在功能dangles超出范围,我可以参考不回了!但是在Go中,这似乎是允许的?

如何像这样的东西去处理?在Go中创建悬挂指针很容易吗?如果有,我有什么措施来控制它们?

在围棋,悬摆指针是没有的事,因为如何escape analysis的工作方式。假设你有这样的代码:

func CreateUser(name string) *User { 
    return &User{Name: name} 
} 

编译器会明白,因为指针可以在函数退出之后访问,结构应在堆中分配。由于Effective Go说:

请注意,不像在C中,它是完全可以返回一个局部变量的地址;与该变量相关的存储在函数返回后仍然存在。