将结构体或指针嵌入结构体作为指针:主要区别
当结构体类型 A 充当仅具有指针接收器和构造函数的指针时返回A,嵌入另一个结构体类型B有两种选择:直接嵌入B或嵌入B.
零值差异:
零值嵌入 B 的 A 与嵌入 *B 的不同。当直接嵌入 B 时,A 的零值包含 B 的嵌入零值,无需初始化即可安全使用:
<code class="go">type B struct { X int } func (b *B) Print() { fmt.Printf("%d\n", b.X) } type AObj struct { B } var aObj AObj aObj.Print() // prints 0</code>
但是,在 APtr 的零值中嵌入 nil 指针值将导致无法直接使用:
<code class="go">type APtr struct { *B } var aPtr APtr aPtr.Print() // panics</code>
对象复制:
对象按预期复制。创建新的 AObj 会复制嵌入的 B:
<code class="go">aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to the copy</code>
相反,创建新的 APtr 会复制 *B,保留共享的具体对象:
<code class="go">aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, due to shared reference</code>
示例:
https://play.golang.org/p/XmOgegwVFeE 提供了一个可运行的示例来演示这些差异。
以上是嵌入结构体或结构体指针:何时以及为何?的详细内容。更多信息请关注PHP中文网其他相关文章!