Home >Backend Development >Golang >Embedded Structs in Go: When to Embed by Value vs. by Pointer?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 19:34:301074browse

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn