Go 中使用嵌入式结构体进行结构体初始化
组合结构体是 Go 中用于代码组织和重用的常见做法。但是,当从嵌入结构继承子字段时,初始化组合结构可能会带来挑战。
考虑以下示例:
type Base struct { ID string } type Child struct { Base a int b int }
要初始化 Child,人们可能期望使用以下内容语法:
child := Child{ ID: id, a: a, b: b }
但是,由于 Child 结构体文本中的字段 ID 未知,这将导致编译错误。要解决此问题,必须单独初始化 ID 字段:
child := Child{ a: 23, b: 42 } child.ID = "foo"
这种方法暴露了 ID 是嵌入字段的事实,从而违反了封装原则。如果将公共字段移动到嵌入式结构中,它还会带来破坏初始化的风险。
要解决此问题,有两种推荐的解决方案:
嵌套复合文字:
嵌套复合文字可用于初始化嵌入字段单个表达式:
child := Child{Base: Base{ID: id}, a: a, b: b}
Go 中的建议更改:
Go 问题 9859 提出了一项更改,以使复合文字与字段访问一致嵌入式类型。如果实现,此更改将允许使用以下语法:
child := Child{ ID: id, a: a, b: b }
需要注意的是,嵌入类型并不提供真正意义上的封装。尽管使用 child.ID 语法,应用程序仍然可以直接访问 child.Base.ID。
以上是如何高效地初始化Go中的嵌入式结构体?的详细内容。更多信息请关注PHP中文网其他相关文章!