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>{&<type>{...}, &<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{&Ex{1, 2}, &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}, &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!