函数结果赋值
来自 C#,这让我感到困惑。在 Go 中,如果我有
type Employee struct {
ID int
Salary int
}
那我就可以了
var tom Employee
tom.Salary = 100
到目前为止,一切都很好。那么如果我有一个功能
func employeeByID(id int) Employee {
// do something and return an employee
}
那为什么不编译呢?
employeeByID(10).Salary = 100
此外,这似乎编译得很好:
andrew := employeeByID(10)
andrew.Salary = 100
回答
它无法编译,因为该赋值无效。
规格: 作业:
每个左侧操作数必须是可寻址的、映射索引表达式或(仅用于 = 赋值)空白标识符。
函数调用的返回值是不可寻址的。详情请参见如何从函数调用中获取返回值的指针?以及如何在 Go 中存储对操作结果的引用?
想一想:你调用一个函数,它返回一个值(你不存储),如果你不存储结果,改变它有什么好处?它将被丢弃,因此分配也将毫无用处。
如果像第二个示例那样将结果存储在变量中,则可以更改其字段,因为变量是可寻址的。