3 回答
TA贡献2011条经验 获得超2个赞
在 Go 中,变量是可寻址的,即您可以获得地址的值。如果左侧是可寻址的,则分配是有效的。
bar().Salary = 1是合法的,因为
bar().Salary实际上是(*bar()).Salary;的语法糖*bar()是可寻址的,因为它是指针间接;可寻址结构的字段(例如
Salary)本身是可寻址的
相比之下,foo().Salary = 1是非法的,因为foo()返回一个值,但它不是变量也不是指针间接;没有办法获得foo()的地址。这就解释了为什么该语句被编译器拒绝。请注意,引入中间变量可以解决您的问题:
// type and function declarations omitted
func main() {
f := foo()
f.Salary = 1 // compiles fine
}
TA贡献1876条经验 获得超5个赞
bar().Salary = 1
返回一个指针,我们正在写入指针指向的对象
foo().Salary = 1
foo() 返回一个临时对象,由于我们没有将它存储在任何地方,如果没有分配给变量,临时对象将会丢失。因此,编译器抱怨
以下将起作用
f = foo() f.Salary = 1
TA贡献1804条经验 获得超3个赞
foo() 返回一个结构类型的“值”,我们不能为一个值分配任何东西。而 bar() 返回一个指向变量的指针。我们可以使用这个指针给这个变量分配一个不同的值
此错误本质上与结构无关,而是与将值分配给值有关。考虑以下示例:
func retint() int{
var a int=5
return a
}
func retintp() *int{
var a int=5
return &a
}
func main(){
print("hello")
*retintp()=10 // this is valid as we can store 10 to address pointed by a
retint()=10 // this gives error. as we can not assign 10 to 5
}
这里 retint() 返回一个值 (5)。我们不能给 5 赋值,但是 retintp() 返回变量 a 的地址。我们可以使用这个地址给它赋值
- 3 回答
- 0 关注
- 264 浏览
添加回答
举报
