假设我有一个嵌入了其他结构的结构。
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()
方法,并希望每个人都使用它,但是 有一种方法可以安全地使用结构文字,而嵌入式结构不会显示某些结构嵌入字段? 或者我在这里应用了错误的模式?
答案 0 :(得分:18)
使用嵌套复合文字来初始化单个表达式中的值:
child := Child{Base: Base{ID: id}, a: a, b: b}
无法隐藏从嵌入式结构中提升字段的事实。