2016-01-06 2 views
2

Заканчивать this sandboxНаследование структуры Golang не работает по назначению?

При объявлении структуру, которая наследуется от другой структуры:

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", 
}) 
Смежные вопросы