”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Go 中的嵌入式结构:何时按值嵌入还是按指针嵌入?

Go 中的嵌入式结构:何时按值嵌入还是按指针嵌入?

发布于2024-11-04
浏览:478

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Go 中的嵌入结构:指针与对象

处理指针接收者和构造指针类型时,了解嵌入结构之间的区别因为对象 (B) 与指针 (*B) 变得至关重要。在这种情况下,这两个嵌入结构类型的零值显着不同。

直接嵌入(对象)

如果具有指针接收器的结构 B 直接嵌入为结构体 A 中的对象,其零值包括类型 B 的嵌入对象,该对象本身也具有零值。开发人员可以安全地访问此嵌入对象及其方法。

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

指针嵌入

相反,嵌入指向 B (*B) 的指针会创建不同的场景。该嵌入结构的零值具有 nil 指针值,使其直接无法使用。

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

对象复制

当创建 AObj 对象时,它会获取嵌入的 B 对象的副本。对副本所做的修改不会影响原始对象。

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0

指针复制

使用 APtr,创建一个新对象会复制指针 (*B),但不会复制指向的底层具体对象到。因此,对新对象的修改会影响原始对象和新对象。

aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1

在确定是将结构体嵌入为对象还是指针时,考虑特定用例和要求非常重要。此决定可能会影响零初始化、复制行为和对象所有权等因素。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3