Home >Backend Development >Golang >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.
<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>
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.
<code class="go">type APtr struct { *B } var aPtr APtr aPtr.Print() // panics</code>
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.
<code class="go">aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0</code>
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.
<code class="go">aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1</code>
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.
The above is the detailed content of Embedded Structs in Go: When to Embed by Value vs. by Pointer?. For more information, please follow other related articles on the PHP Chinese website!