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

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

Patricia Arquette
Patricia Arquette原创
2024-10-30 06:06:03416浏览

 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中文网其他相关文章!

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