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

时间:2017-05-22 23:08:51

标签: go

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

type Base struct {
    ID string
}

type Child struct {
    Base
    a int
    b int
}

当我开始初始化Child时,我无法直接初始化ID字段。

// unknown field 'ID' in struct literal of type Child
child := Child{ ID: id, a: a, b: b }

我必须单独初始化ID字段。

child := Child{ a: 23, b: 42 }
child.ID = "foo"

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

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

1 个答案:

答案 0 :(得分:18)

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

child := Child{Base: Base{ID: id}, a: a, b: b}

无法隐藏从嵌入式结构中提升字段的事实。