當(dāng)聲明一個繼承自不同結(jié)構(gòu)的結(jié)構(gòu)時:type Base struct { a string b string}type Something struct { Base c string}然后調(diào)用為繼承值指定值的函數(shù)會產(chǎn)生編譯錯誤:f(Something{ a: "letter a", c: "letter c",})錯誤信息是:unknown Something field 'a' in struct literal。這對我來說似乎很奇怪。這真的是預(yù)期的功能嗎?謝謝您的幫助!
3 回答

慕田峪4524236
TA貢獻(xiàn)1875條經(jīng)驗 獲得超5個贊
Golang 沒有提供典型的繼承概念。你在這里完成的是嵌入。
它不給外部結(jié)構(gòu)內(nèi)部結(jié)構(gòu)的字段,而是允許外部結(jié)構(gòu)訪問內(nèi)部結(jié)構(gòu)的字段。
為了創(chuàng)建外部結(jié)構(gòu),Something
您需要提供包含內(nèi)部結(jié)構(gòu)的字段Base
在你的情況下:
Something{Base: Base{a: "letter a"}, c: "letter c"}

智慧大石
TA貢獻(xiàn)1946條經(jīng)驗 獲得超3個贊
您需要像這樣顯式創(chuàng)建 Base 字段
f(Something{
Base: Base{a: "letter a"},
c: "letter c",
})
Go 沒有繼承,它只是組合。

喵喵時光機(jī)
TA貢獻(xiàn)1846條經(jīng)驗 獲得超7個贊
您還必須實際實例化嵌入的結(jié)構(gòu)。只是為了讓您知道這在技術(shù)上不是繼承,Go 中不存在這樣的功能。這叫做嵌入。它只是將字段和方法從嵌入類型提升到嵌入范圍。所以無論如何,您嘗試執(zhí)行的復(fù)合文字實例化看起來像這樣;
f(Something{
Base: Base{a: "a", b: "b"},
c: "c",
})
- 3 回答
- 0 關(guān)注
- 232 瀏覽
添加回答
舉報
0/150
提交
取消