亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我的函數返回一個結構;為什么編譯器不允許分配給該結果值的字段?

我的函數返回一個結構;為什么編譯器不允許分配給該結果值的字段?

Go
呼喚遠方 2022-05-05 17:42:42
在golang中,如果我在函數中返回一個struct類型,會出現編譯錯誤,我必須使用struct的指針作為返回類型,才能通過函數調用直接實現成員訪問。這是為什么?foo() 不返回 Employee 類型的臨時變量嗎?package maintype Employee struct {ID intName stringAddress stringPosition stringSalary intManagerID int}var dilbert Employeefunc foo() Employee {    employee := Employee{}    return employee}func bar() *Employee {    employee := Employee{}    return &employee}func main() {    dilbert.Salary = 1    var b = foo()    b.Salary = 1    bar().Salary = 1    // this is good    foo().Salary = 1    // this line has the compilation error cannot assign to foo().Salary}
查看完整描述

3 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

在 Go 中,變量是可尋址的,即您可以獲得地址的值。如果左側是可尋址的,則分配是有效的。

bar().Salary = 1是合法的,因為

  1. bar().Salary實際上是(*bar()).Salary;的語法糖

  2. *bar()是可尋址的,因為它是指針間接;

  3. 可尋址結構的字段(例如Salary)本身是可尋址的

相比之下,foo().Salary = 1是非法的,因為foo()返回一個值,但它不是變量也不是指針間接;沒有辦法獲得foo()的地址。這就解釋了為什么該語句被編譯器拒絕。請注意,引入中間變量可以解決您的問題:

// type and function declarations omitted


func main() {

    f := foo()

    f.Salary = 1 // compiles fine

}


查看完整回答
反對 回復 2022-05-05
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

bar().Salary = 1

返回一個指針,我們正在寫入指針指向的對象

foo().Salary = 1

foo() 返回一個臨時對象,由于我們沒有將它存儲在任何地方,如果沒有分配給變量,臨時對象將會丟失。因此,編譯器抱怨

以下將起作用

f = foo()
f.Salary = 1


查看完整回答
反對 回復 2022-05-05
?
狐的傳說

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 的地址。我們可以使用這個地址給它賦值


查看完整回答
反對 回復 2022-05-05
  • 3 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號