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

bee*_*ree 10 go

看看这个沙箱

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

type Base struct {
    a string
    b string
}

type Something struct {
    Base
    c string
}
Run Code Online (Sandbox Code Playgroud)

然后调用指定继承值的值的函数会产生编译错误:

f(Something{
    a: "letter a",
    c: "letter c",
})
Run Code Online (Sandbox Code Playgroud)

错误消息是:unknown Something field 'a' in struct literal.

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

谢谢您的帮助!

Leo*_*rea 23

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

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

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

在你的情况下:

Something{Base: Base{a: "letter a"}, c: "letter c"}
Run Code Online (Sandbox Code Playgroud)

  • 一个好的结果是,如果你执行 json.Marshal 你将得到你想要的 {a, b, c} 结构 (2认同)

Grz*_*Żur 6

您需要显式创建这样的Base字段

f(Something{
    Base: Base{a: "letter a"},
    c:    "letter c",
})
Run Code Online (Sandbox Code Playgroud)

Go没有继承,只是组合.

  • 组合是无处不在的计算机科学术语,值得指出的是,这里使用的实际 Go 功能是嵌入。 (2认同)

eva*_*nal 5

您还必须实际实例化嵌入结构。你知道这在技术上不是继承,Go 中不存在这样的功能。这就是所谓的嵌入。它只是将字段和方法从嵌入类型提升到嵌入器范围。所以无论如何,您尝试执行的复合文字实例化将如下所示;

f(Something{
    Base: Base{a: "a", b: "b"},
    c:    "c",
})
Run Code Online (Sandbox Code Playgroud)