当使用结构类型作为指针时(即,使用指针接收器,构造函数返回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中文网其他相关文章!