Golang结构继承不按预期工作?

时间:2016-01-06 22:31:36

标签: go

查看this sandbox

声明从不同结构继承的结构时:

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

这对我来说似乎非常奇怪。这真的是预期的功能吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:20)

Golang没有提供典型的继承概念。你在这里完成的是酝酿。

它不给外部结构提供内部结构的字段,而是允许外部结构访问内部结构的字段。

为了创建外部结构Something,您需要提供包含内部结构Base

的字段。

在你的情况下:

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

答案 1 :(得分:6)

您需要显式创建类似

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

Go没有继承,只是组合。

答案 2 :(得分:3)

您还必须实际实例化嵌入式结构。只是因为你知道这不是技术上的继承,Go中没有这样的功能。它被称为嵌入。它只是将字段和方法从嵌入类型提升到嵌入器范围。所以无论如何,你试图做的复合文字实例化看起来像这样;

test | test name | test value