处理Go中的悬空指针

9

我正在同时阅读Rust和Go,我发现这两种语言在处理悬垂指针及其引起的问题方面存在微妙差异。例如,以下是Rust的一种版本:

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

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

    &s
}

上述代码会出错,因为在函数dangle中,s超出了作用域,我不能返回对它的引用!但在Go语言中,这似乎是被允许的?

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

1个回答

26
在Go语言中,由于逃逸分析的工作方式,悬空指针并不存在。假设你有这样一段代码:
func CreateUser(name string) *User {
    return &User{Name: name}
}

编译器会理解,因为指针在函数退出后仍然可以访问,所以结构体应该在堆上分配。正如《Effective Go》所说:
请注意,与C不同,返回局部变量的地址是完全可以的;与变量相关联的存储在函数返回后仍然存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接