3 回答

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
在 Go 中,變量是可尋址的,即您可以獲得地址的值。如果左側(cè)是可尋址的,則分配是有效的。
bar().Salary = 1
是合法的,因?yàn)?/p>
bar().Salary
實(shí)際上是(*bar()).Salary
;的語(yǔ)法糖*bar()
是可尋址的,因?yàn)樗侵羔橀g接;可尋址結(jié)構(gòu)的字段(例如
Salary
)本身是可尋址的
相比之下,foo().Salary = 1
是非法的,因?yàn)?code>foo()返回一個(gè)值,但它不是變量也不是指針間接;沒(méi)有辦法獲得foo()
的地址。這就解釋了為什么該語(yǔ)句被編譯器拒絕。請(qǐng)注意,引入中間變量可以解決您的問(wèn)題:
// type and function declarations omitted
func main() {
f := foo()
f.Salary = 1 // compiles fine
}

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
bar().Salary = 1
返回一個(gè)指針,我們正在寫(xiě)入指針指向的對(duì)象
foo().Salary = 1
foo() 返回一個(gè)臨時(shí)對(duì)象,由于我們沒(méi)有將它存儲(chǔ)在任何地方,如果沒(méi)有分配給變量,臨時(shí)對(duì)象將會(huì)丟失。因此,編譯器抱怨
以下將起作用
f = foo() f.Salary = 1

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
foo() 返回一個(gè)結(jié)構(gòu)類(lèi)型的“值”,我們不能為一個(gè)值分配任何東西。而 bar() 返回一個(gè)指向變量的指針。我們可以使用這個(gè)指針給這個(gè)變量分配一個(gè)不同的值
此錯(cuò)誤本質(zhì)上與結(jié)構(gòu)無(wú)關(guān),而是與將值分配給值有關(guān)。考慮以下示例:
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() 返回一個(gè)值 (5)。我們不能給 5 賦值,但是 retintp() 返回變量 a 的地址。我們可以使用這個(gè)地址給它賦值
- 3 回答
- 0 關(guān)注
- 189 瀏覽
添加回答
舉報(bào)