2016-01-06 63 views
2

退房this sandboxGolang結構繼承不按預期工作?

當宣佈從不同的結構繼承的結構:

type Base struct { 
    a string 
    b string 
} 

type Something struct { 
    Base 
    c string 
} 

然後調用函數的繼承值規定值給出了一個編譯錯誤:

f(Something{ 
    a: "letter a", 
    c: "letter c", 
}) 

錯誤消息是:unknown Something field 'a' in struct literal

這對我來說似乎很奇怪。這真的是預期的功能嗎?

感謝您的幫助!

回答

11

Golang沒有提供典型的繼承概念。你在這裏完成的是編程。

它不給外部結構內部結構的字段,而是允許外部結構訪問內部結構的字段。

爲了創建Something你需要給它的領域,其中包括內部結構Base

在你的情況下,外部結構:

Something{Base: Base{a: "letter a"}, c: "letter c"} 
5

你需要明確創建基礎領域一樣,

f(Something{ 
    Base: Base{a: "letter a"}, 
    c: "letter c", 
}) 

Go有沒有繼承,它只是組成。

+1

組成是無處不在的計算機科學術語,值得指出的是,雖然這裏使用的實際Go功能是嵌入。 – evanmcdonnal

+1

@evanmcdonnal確實,但我故意使用這種措辭,因爲https://en.wikipedia.org/wiki/Composition_over_inheritance –

3

你有實際實例化嵌入式結構爲好。只是你知道這不是技術上的繼承,Go中沒有這樣的特性。它被稱爲嵌入。它只是將字段和方法從嵌入式升級到嵌入式範圍。無論如何,你正在嘗試的複合文字實例看起來就像這樣;

f(Something{ 
    Base: Base{a: "a", b: "b"}, 
    c: "c", 
})