在 Go 中处理悬挂指针
Handling Dangling Pointers in Go
我一直在并行阅读 Rust 和 Go,我发现这两种语言在处理悬垂指针及其引起的问题的方式上存在细微差别。例如,这是 Rust 中的一个版本:
fn main() {
let reference_to_nothing = dangle();
}
fn dangle() -> &String {
let s = String::from("hello");
&s
}
上面会出错,说在函数 dangle
中,s
超出范围,我不能 return 引用它!但是在 Go 中,这似乎是允许的?
Go 是如何处理这种事情的?在 Go 中创建悬挂指针容易吗?如果是这样,我必须采取什么措施来控制它们?
在 Go 中,由于 escape analysis 的工作方式,悬挂指针不是问题。假设您有这样的代码:
func CreateUser(name string) *User {
return &User{Name: name}
}
编译器会理解,因为函数退出后可以访问指针,所以结构应该分配在堆上。正如 Effective Go 所说:
Note that, unlike in C, it's perfectly OK to return the address of a local variable; the storage associated with the variable survives after the function returns.
我一直在并行阅读 Rust 和 Go,我发现这两种语言在处理悬垂指针及其引起的问题的方式上存在细微差别。例如,这是 Rust 中的一个版本:
fn main() {
let reference_to_nothing = dangle();
}
fn dangle() -> &String {
let s = String::from("hello");
&s
}
上面会出错,说在函数 dangle
中,s
超出范围,我不能 return 引用它!但是在 Go 中,这似乎是允许的?
Go 是如何处理这种事情的?在 Go 中创建悬挂指针容易吗?如果是这样,我必须采取什么措施来控制它们?
在 Go 中,由于 escape analysis 的工作方式,悬挂指针不是问题。假设您有这样的代码:
func CreateUser(name string) *User {
return &User{Name: name}
}
编译器会理解,因为函数退出后可以访问指针,所以结构应该分配在堆上。正如 Effective Go 所说:
Note that, unlike in C, it's perfectly OK to return the address of a local variable; the storage associated with the variable survives after the function returns.