一尘不染

Go中的临时地址?

go

处理这种情况的最干净方法是什么:

func a() string {
    /* doesn't matter */
}

b *string = &a()

这将产生错误:

不能使用a()的地址

我的理解是,如果使用了Go地址,Go会自动将局部变量提升到堆中。在这里,很明显要使用返回值的地址。什么是惯用的处理方式?


阅读 181

收藏
2020-07-02

共1个答案

一尘不染

地址运算符返回一个指向具有“家”的东西的指针,例如变量。您的代码中表达式的值是“无家可归”。如果您确实需要* string,则必须分两个步骤进行操作:

tmp := a(); b := &tmp

请注意,尽管*
string有完全有效的用例,但很多时候使用它们是错误的。在Go中,它string是一种值类型,但是是一种便宜的值类型(一个指针和一个int)。字符串的
是不可变的,更改了*string“ home”所指向的位置,而不是字符串值,因此在大多数情况下*string根本不需要。

2020-07-02