如何在Go中初始化组合结构?

Sch*_*ern 14 go

假设我有一个嵌入了其他结构的结构.

type Base struct {
    ID string
}

type Child struct {
    Base
    a int
    b int
}
Run Code Online (Sandbox Code Playgroud)

当我进行初始化时Child,我无法ID直接初始化该字段.

// unknown field 'ID' in struct literal of type Child
child := Child{ ID: id, a: a, b: b }
Run Code Online (Sandbox Code Playgroud)

我必须分别初始化ID字段.

child := Child{ a: 23, b: 42 }
child.ID = "foo"
Run Code Online (Sandbox Code Playgroud)

这似乎违反了封装.Child的用户必须知道ID字段有不同之处.如果我稍后将公共字段移动到嵌入式结构中,则可能会破坏初始化.

我可以NewFoo()为每个结构编写一个方法,并希望每个人都使用它,但有没有办法安全地使用结构文字嵌入式结构,而不会显示某些字段是嵌入的?或者我在这里应用错误的模式?

Cer*_*món 28

使用嵌套复合文字来初始化单个表达式中的值:

child := Child{Base: Base{ID: id}, a: a, b: b}
Run Code Online (Sandbox Code Playgroud)

隐藏从嵌入式结构中提升字段这一事实是不可能的.

  • 虽然`child.ID`隐藏了`ID`是嵌入式的,但初始化程序却没有?多么奇怪的疏忽.如果我想要初始化封装,我需要编写自己的`New`函数? (4认同)
  • 嵌入式领域的现场推广是语法糖.该功能不提供封装. (4认同)
  • @CeriseLimón,我认为Schwern的观点是语法糖存在于"getter"中,但不存在于初始化器上.这是不一致的. (4认同)