7

我一直在并行阅读 Rust 和 Go,我发现这两种语言在处理悬空指针及其导致的问题方面存在细微差别。例如,这里是 Rust 的一个版本:

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

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

    &s
}

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

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

4

1 回答 1

22

在 Go 中,由于转义分析的工作方式,悬空指针不是一件事。假设你有这样的代码:

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

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

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

于 2017-10-28T08:16:56.287 回答