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 關注
- 177 瀏覽
添加回答
舉報