首页  >  文章  >  后端开发  >  嵌入结构体或结构体指针:何时以及为何?

嵌入结构体或结构体指针:何时以及为何?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 02:51:27696浏览

Embed a Struct or a Pointer to a Struct: When and Why?

将结构体或指针嵌入结构体作为指针:主要区别

当结构体类型 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中文网其他相关文章!

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