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

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

Golang 嵌入式結構

Golang 嵌入式結構

Go
月關寶盒 2023-06-19 15:42:28
我對 Go 關于嵌入式結構中變量“覆蓋”的行為有點困惑。第一種情況?如果一個child結構嵌入了一個parent包含字段的結構,我可以用orAttr無差別地訪問 Attr 的值。這是一個例子:child.Attrchild.parent.Attrpackage mainimport (? ? "fmt"? ? "encoding/json")type parent struct {? ? Attr? ? int `json:"attr"`}type child struct {? ? parent}func main() {? ? var c child? ? json.Unmarshal([]byte(`{"i": 1}`), &c)? ? fmt.Println(c.Attr)? ? fmt.Println(c.parent.Attr)}第二種情況?但是,如果子結構本身包含一個名為 的字段Attr,則這兩個字段是不同的,可以單獨訪問,如以下示例所示:package mainimport (? ? "fmt"? ? "encoding/json")type parent struct {? ? Attr? ? int `json:"attr"`}type child struct {? ? parent? ? Attr? ? int}func main() {? ? var c child? ? json.Unmarshal([]byte(`{"attr": 1}`), &c)? ? fmt.Println(c.Attr)? ? fmt.Println(c.parent.Attr)}我很驚訝 golang 中允許這種隱式行為。我原以為語言會更嚴格,因為它在很多方面都如此。此外,我找不到關于此的明確規范。這只是副作用還是我可以使用該功能?
查看完整描述

1 回答

?
HUH函數

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

Golang 規范實際上說明了嵌入式字段是如何解析的

一個選擇器f可能表示一個類型T的字段或方法f,也可能指代T的嵌套嵌入字段的字段或方法f。遍歷到達f的嵌入字段的個數稱為它在T中的深度。 T 中聲明的字段或方法 f 的深度為零。在 T 中的嵌入字段 A 中聲明的字段或方法 f 的深度是 f 在 A 中的深度加一。

然后...

對于類型為 T 或 *T 的值 x,其中 T 不是指針或接口類型,xf 表示 T 中存在此類 f 的最淺深度處的字段或方法。如果不存在深度最淺的 f,則選擇器表達式是非法的。


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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