我對 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,則選擇器表達式是非法的。
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消