在 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>
创建这些类型的新对象时,行为有所不同:
选择直接嵌入结构或使用指针取决于预期的用例。嵌入结构提供了直接访问嵌入字段的便利,而嵌入指针允许对嵌入结构进行修改以影响多个副本。了解这些含义可确保正确使用并避免代码中潜在的陷阱。
以上是在 Go 中嵌入结构体或指向结构体的指针:何时应该选择什么?的详细内容。更多信息请关注PHP中文网其他相关文章!