首页 >后端开发 >Golang >嵌入式结构与结构指针:零值和复制有什么关系?

嵌入式结构与结构指针:零值和复制有什么关系?

DDD
DDD原创
2024-10-30 09:12:03342浏览

Embedded Struct vs Pointer to Struct: What's the Deal with Zero Values and Copying?

嵌入式结构与指向结构的指针:对零值和复制的影响

当使用结构类型作为指针时(即,使用指针接收器,构造函数返回A 等),嵌入结构体(如 B)或其指针(如 B)之间的选择具有微妙但重要的后果。

零值

两个选项的零值差异很大。嵌入 B 直接创建一个具有零值的嵌入对象,这允许对其进行立即操作:

<code class="go">type AObj struct { B }
var aObj AObj
aObj.Print() // Prints 0 (B's zero value)</code>

相反,嵌入 *B 会产生带有 nil 指针的零值,从而阻止直接使用:

<code class="go">type APtr struct { *B }
var aPtr APtr
aPtr.Print() // Panics (nil pointer dereference)</code>

复制

对象复制行为取决于嵌入类型。当 B 作为对象嵌入时,复制时会创建一个新对象:

<code class="go">type AObj struct { B }
aObj2 := aObj
aObj.X = 1
aObj2.Print() // Prints 0 (copy of B's zero value)</code>

相反,使用指针嵌入 (*B),原始对象和复制对象共享相同的基础 B 对象,从而允许同步更改:

<code class="go">type APtr struct { *B }
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // Prints 1 (shared underlying B)</code>

这些差异对于代码可读性、可维护性和性能优化具有实际影响。通过了解结构嵌入与指针嵌入的细微差别,开发人员可以主动避免潜在的陷阱,并针对其特定用例利用最合适的方法。

以上是嵌入式结构与结构指针:零值和复制有什么关系?的详细内容。更多信息请关注PHP中文网其他相关文章!

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