"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > Embedded Structs in Go: When to Embed by Value vs. by Pointer?

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

Published on 2024-11-04
Browse:508

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

Embedded Structs in Go: Pointer vs. Object

When dealing with pointer receivers and constructing pointer types, understanding the difference between embedding a struct as an object (B) versus a pointer (*B) becomes crucial. In this context, the zero values of these two embedded struct types differ significantly.

Direct Embedding (Object)

If a struct B with pointer receivers is embedded directly as an object within a struct A, its zero value includes an embedded object of type B, which itself has a zero value. Developers can safely access this embedded object and its methods.

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

Pointer Embedding

In contrast, embedding a pointer to B (*B) creates a different scenario. The zero value of this embedded struct has a nil pointer value, rendering it unusable directly.

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

Object Copying

When an AObj object is created, it obtains a copy of the embedded B object. Modifications made to the copy do not affect the original object.

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

Pointer Copying

With APtr, creating a new object copies the pointer (*B) but not the underlying concrete object pointed to. Therefore, modifications to the new object affect both the original and new objects.

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

It is important to consider the specific use case and requirements when determining whether to embed a struct as an object or a pointer. This decision can impact zero initialization, copying behavior, and object ownership, among other factors.

Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3