Home  >  Article  >  Backend Development  >  How does Go handle the initialization of a slice of pointers with anonymous structs?

How does Go handle the initialization of a slice of pointers with anonymous structs?

Barbara Streisand
Barbara StreisandOriginal
2024-10-31 15:39:13355browse

How does Go handle the initialization of a slice of pointers with anonymous structs?

Initializing Slice of Pointers with Anonymous Structs in Go

In Chapter 7.6 of the "Go Programming Language" text, the initialization of a slice of Track pointers using anonymous structs (structures without explicit type definitions) can be confusing. The following example illustrates this:

<code class="go">var tracks = []*Track{
    {"Go", "Delilah", "From the Roots Up", 2012, length("3m38s")},
    {"Go", "Moby", "Moby", 1992, length("3m37s")},
    {"Go Ahead", "Alicia Keys", "As I Am", 2007, length("4m36s")},
    {"Ready 2 Go", "Martin Solveig", "Smash", 2011, length("4m24s")},
}</code>

The syntax for initializing a slice of pointers resembles the initialization of a slice of structs, with the addition of * before the element type. However, under the hood, the syntax is actually a shortcut for initializing a slice of values with a type specified at compile time.

<code class="go">f := []<type>{{...}, {...}}</code>

This is equivalent to the following:

<code class="go">f := []<type>{<type>{...}, <type>{...}}</code>

In the case of pointers, it becomes:

<code class="go">f := []*<type>{{...}, {...}}</code>

Which is equivalent to:

<code class="go">f := []*<type>{&amp;<type>{...}, &amp;<type>{...}}</code>

This means that the anonymous struct syntax is a convenience for initializing slices of pointers.

However, note that when initializing a slice of pointers, the values can be of an anonymous struct type, as long as the type remains consistent within the slice.

<code class="go">a := []Ex{Ex{1, 2}, Ex{3, 4}}
b := []Ex{{1, 2}, {3, 4}}
c := []*Ex{&amp;Ex{1, 2}, &amp;Ex{3, 4}}
d := []*Ex{{1, 2}, {3, 4}}</code>

Mixing and matching anonymous structs with regular structs is not allowed, as in this example:

<code class="go">e := []*Ex{{1, 2}, &amp;Ex{3, 4}} // Syntax Error!</code>

This occurs because the compiler cannot infer the type of the anonymous struct from a pointer to a struct.

The above is the detailed content of How does Go handle the initialization of a slice of pointers with anonymous structs?. 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