首页 > 后端开发 > Golang > 如何高效地初始化Go中的嵌入式结构体?

如何高效地初始化Go中的嵌入式结构体?

Mary-Kate Olsen
发布: 2024-12-17 01:03:24
原创
701 人浏览过

How Can I Efficiently Initialize Embedded Structs in Go?

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 是嵌入字段的事实,从而违反了封装原则。如果将公共字段移动到嵌入式结构中,它还会带来破坏初始化的风险。

要解决此问题,有两种推荐的解决方案:

  1. 嵌套复合文字:

    嵌套复合文字可用于初始化嵌入字段单个表达式:

    child := Child{Base: Base{ID: id}, a: a, b: b}
    登录后复制
  2. Go 中的建议更改:

    Go 问题 9859 提出了一项更改,以使复合文字与字段访问一致嵌入式类型。如果实现,此更改将允许使用以下语法:

    child := Child{ ID: id, a: a, b: b }
    登录后复制
    登录后复制

需要注意的是,嵌入类型并不提供真正意义上的封装。尽管使用 child.ID 语法,应用程序仍然可以直接访问 child.Base.ID。

以上是如何高效地初始化Go中的嵌入式结构体?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板