在Go中处理悬空指针

spa*_*rkr 1 pointers go dangling-pointer

我一直在阅读Rust和Go并且我看到这些语言如何处理悬空指针及其引起的问题的细微差别.例如,这是Rust中的一个版本:

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

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

    &s
}
Run Code Online (Sandbox Code Playgroud)

上面会错误地说,在函数中dangle,s超出范围,我不能返回它的引用!但在Go中,这似乎有点允许吗?

Go中如何处理这样的事情?在Go中创建悬空指针是否容易?如果是这样,我有什么措施来控制它们?

ber*_*eal 13

在Go中,由于逃逸分析的工作方式,悬空指针不是一个东西.假设你有这样的代码:

func CreateUser(name string) *User {
    return &User{Name: name}
}
Run Code Online (Sandbox Code Playgroud)

编译器将理解,因为在函数退出后可以访问指针,所以应该在堆上分配结构.正如Effective Go所说:

请注意,与C不同,返回局部变量的地址是完全可以的.与函数关联的存储在函数返回后仍然存在.