处理这种情况最干净的方法是什么:
func a() string {
/* doesn't matter */
}
b *string = &a()
这会产生错误:
cannot take the address of a()
我的理解是,如果它的地址被占用,Go 会自动将局部变量提升到堆中。这里很明显是要取返回值的地址。处理此问题的惯用方法是什么?
最佳答案
地址运算符返回指向具有“家”的东西的指针,例如一个变量。您的代码中表达式的值是“无家可归”。如果你真的需要一个 *string,你必须分两步完成:
tmp := a(); b := &tmp
请注意,虽然 *string 有完全有效的用例,但很多时候使用它们是错误的。在 Go 中,string
是一种值类型,但传递起来很便宜(一个指针和一个 int)。 String 的 value 是不可变的,更改 *string
会更改“home”指向的位置,而不是字符串值,因此在大多数情况下 *string
根本不需要。
关于pointers - Go 中的临时地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124798/