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

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

指針/非指針類型的struct字段賦值差異

指針/非指針類型的struct字段賦值差異

Go
函數式編程 2021-11-22 18:34:33
在 Go 編程語言的第 4.4 節(結構)中,有一段代碼摘錄:var dilbert Employeefunc EmployeeByID(id int) *Employee { /* ... */ }id := dilbert.IDEmployeeByID(id).salary = 0與此評論如果將 的結果類型EmployeeByID更改為Employee而不是*Employee,則賦值語句將無法編譯,因為其左側無法識別變量。我不明白為什么更改EmployeeByIDto的結果類型Employee會導致 LHS 無法識別變量。
查看完整描述

3 回答

?
森欄

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

我已經研究過這個主題,我認為如果您更改為 Employee 而不是 *Employee,那么 EmployeeByID(id) 將是一個無法尋址的值,因為它沒有分配給變量。如果你給它分配一個像下面這樣的變量就可以了:


e1 := EmployeeByID(id)

e1.Salary = 0


查看完整回答
反對 回復 2021-11-22
?
慕斯王

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

這個簡化的例子演示了這個問題:


package main


type t struct {

    int

}


func newT() *t { return &t{} }

//func newT() t { return t{} }


func main() {

    newT().int = 0

}

我的猜測是,如果您使用newT不返回指針的版本,并且永遠不會保存對 的結果的引用newT(),那么設置其int字段的值將永遠無法做任何有意義的事情。這類似于設置一個未使用的變量。


如果你使用的是非指針版本newT但你有類似的東西:


x := newT()

x.int = 0

那你就好了。


或者,使用newT上面的指針版本也可以,因為它可能會返回您之前已經定義的某些狀態,請參見示例:


package main


type t struct {

    int

}


var dilbert = &t{3}


func newT() *t { return dilbert }


//func newT() t { return t{} }


func main() {

    println(dilbert.int)

    newT().int = 0

    println(dilbert.int)

}


查看完整回答
反對 回復 2021-11-22
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

func EmployeeByID(id int) *Employee { /* ... */ }

這將返回一個指向 Employee 變量的指針。

func EmployeeByID(id int) Employee { /* ... */ }

這會返回一個從一個Employee變量復制。在使用它之前,您需要將它分配給一個變量。


查看完整回答
反對 回復 2021-11-22
  • 3 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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