【问题标题】:Handling Dangling Pointers in Go在 Go 中处理悬空指针
【发布时间】:2018-04-09 19:05:24
【问题描述】:

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

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

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

    &s
}

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

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

【问题讨论】:

    标签: pointers go dangling-pointer


    【解决方案1】:

    在 Go 中,由于escape analysis 的工作方式,悬空指针不是一个东西。假设你有这样的代码:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 2014-01-15
      • 2013-01-10
      • 2011-07-14
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      相关资源
      最近更新 更多