我一直在并行阅读Rust和Go,我看到这两种语言在处理悬挂指针及其引起的问题方面的细微差异。例如,下面是Rust中的一个版本:
fn main() {
let reference_to_nothing = dangle();
}
fn dangle() -> &String {
let s = String::from("hello");
&s
}
字符串
上面的错误是说在函数dangle
中,s
超出了作用域,我不能返回对它的引用!但在Go中,这似乎是允许的?
在Go中如何处理这样的事情?在Go中创建悬空指针容易吗?如果是这样,我有什么措施来控制它们?
1条答案
按热度按时间pcww981p1#
在Go中,由于escape analysis的工作方式,悬挂指针不是一个东西。假设你有一个这样的代码:
字符串
编译器会理解,因为指针可以在函数退出后访问,所以结构应该在堆上分配。Effective Go说道:
请注意,与C语言不同,返回局部变量的地址是完全可以的;与变量相关联的存储在函数返回之后继续存在。