首页 > 后端开发 > Golang > 在 Go 中嵌入结构体或指向结构体的指针:何时应该选择什么?

在 Go 中嵌入结构体或指向结构体的指针:何时应该选择什么?

Patricia Arquette
发布: 2024-10-30 06:06:03
原创
544 人浏览过

 Embed a Struct or a Pointer to a Struct in Go: When Should You Choose What?

在结构体中嵌入结构体与指向结构体的指针用作指针

在 Go 中,通常需要将结构体作为指针引用,特别是在使用面向对象时模式。但是,当将一个结构嵌入到另一个用作指针的结构中时,需要做出选择:嵌入结构本身或指向它的指针。此决定具有微妙的含义,可能会影响代码行为。

嵌入结构体

考虑以下代码:

<code class="go">type B struct {
    X int
}

type A struct {
    B
}</code>
登录后复制

这里,B 结构体直接嵌入到一个结构体。 A 的零值包括 B 类型的嵌入对象,该对象也有其零值。因此,我们可以安全地调用嵌入 B 对象的 Print 方法:

<code class="go">var a A
a.Print() // prints 0</code>
登录后复制

将指针嵌入到结构体

相反,请考虑以下代码:

<code class="go">type B struct {
    X int
}

type A struct {
    *B
}</code>
登录后复制

这里,B 结构体作为指针嵌入到 A 结构体中。 A 的零值对于嵌入的 *B 有一个 nil 指针值。尝试对嵌入的 *B 对象调用 Print 方法将导致恐慌:

<code class="go">var a A
a.Print() // panics</code>
登录后复制

复制差异

创建这些类型的新对象时,行为有所不同:

  • 对于 A 对象,会创建嵌入的 B 对象的副本,这意味着对嵌入字段进行的任何修改都不会影响原始对象。
  • 对于具有嵌入指针的 A 对象,会创建一个副本*B 指针的值被创建,这意味着对底层 B 对象所做的任何修改都会影响原始对象和共享同一指针的任何副本。

结论

选择直接嵌入结构或使用指针取决于预期的用例。嵌入结构提供了直接访问嵌入字段的便利,而嵌入指针允许对嵌入结构进行修改以影响多个副本。了解这些含义可确保正确使用并避免代码中潜在的陷阱。

以上是在 Go 中嵌入结构体或指向结构体的指针:何时应该选择什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

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