猿问

Go中的临时地址?

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


func a() string {

    /* doesn't matter */

}


b *string = &a()

这将产生错误:

不能使用a()的地址

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


波斯汪
浏览 233回答 3
3回答

森林海

&只能用于:可寻址的东西:变量,指针间接寻址,切片索引操作,可寻址结构的字段选择器,可寻址数组的数组索引操作;或者复合文字您所拥有的都不是这些,所以它是行不通的。我什至不知道那意味着什么,即使你能做到。取一个函数调用结果的地址?通常,您将某物的指针传递给某人,因为您希望他们能够将其分配给所指向的物,并查看原始变量中的变化。但是函数调用的结果是暂时的。除非您先将其分配给其他人,否则没有其他人“看到”它。如果创建指针的目的是创建具有动态生存期的内容,类似于new()或获取复合文字的地址,则可以将函数调用的结果分配给变量并获取其地址。

交互式爱情

最后,您建议Go应该允许您使用任何表达式的地址,例如:i,j := 1,2var p *int = &(i+j)println(*p)当前的Go编译器会显示以下错误: cannot take the address of i + j我认为,允许程序员使用任何表达式的地址:似乎不是很有用(也就是说:在实际的Go程序中,发生的可能性很小)。它将使编译器和语言规范变得复杂。使编译器和规范复杂化而收效甚微似乎适得其反。
随时随地看视频慕课网APP

相关分类

Go
我要回答