首页 >后端开发 >Golang >如何在 Go 中正确初始化组合结构?

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

DDD
DDD原创
2024-12-24 04:26:17463浏览

How to Properly Initialize Composed Structs in Go?

在 Go 中初始化组合结构

在 Go 中组合结构涉及将一个结构嵌入到另一个结构中。虽然这种技术提供了代码组织和重用的好处,但它也可能带来初始化挑战。

初始化组合结构时,可能无法直接访问嵌入结构的字段。请考虑以下代码示例:

type Base struct {
    ID string
}

type Child struct {
    Base
    a int
    b int
}

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

在此示例中,由于字段不可访问,尝试直接在 Child 结构体文字中初始化 ID 字段会失败。要解决此问题,必须首先初始化没有 ID 的 Child 结构,然后单独设置 ID。

但是,这种方法通过向用户公开 Child 结构的内部结构来损害封装性。为了避免这种情况,Go 提供了一种安全地初始化组合结构的方法:嵌套复合文字。

使用嵌套复合文字

嵌套复合文字允许您初始化嵌入的结构体值在单个表达式中:

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

在此示例中,Base 结构是首先进行初始化,并将 ID 字段设置为所需的值。然后使用生成的 Base 结构体来初始化 Child 结构体。

替代方法

Go 问题 9859 提出了一项可以简化嵌入式结构体初始化的更改。此更改将允许使用 Child{ ID: id, a: a, b: b } 表达式,使其与嵌入类型的字段访问一致。

封装注意事项

值得注意的是,嵌入类型在 Go 中并不提供真正的封装。应用程序仍然可以直接访问嵌入结构的字段,绕过封闭结构的方法。因此,在设计结构时请仔细考虑封装的需要。

以上是如何在 Go 中正确初始化组合结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn