Go语言中指针的处理

bt1cpqcv  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(94)

我一直在并行阅读Rust和Go,我看到这两种语言在处理悬挂指针及其引起的问题方面的细微差异。例如,下面是Rust中的一个版本:

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

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

    &s
}

字符串
上面的错误是说在函数dangle中,s超出了作用域,我不能返回对它的引用!但在Go中,这似乎是允许的?
在Go中如何处理这样的事情?在Go中创建悬空指针容易吗?如果是这样,我有什么措施来控制它们?

pcww981p

pcww981p1#

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

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

字符串
编译器会理解,因为指针可以在函数退出后访问,所以结构应该在堆上分配。Effective Go说道:
请注意,与C语言不同,返回局部变量的地址是完全可以的;与变量相关联的存储在函数返回之后继续存在。

相关问题