Go 中用匿名结构初始化指针切片
《Go 编程语言》第 7.6 章中,切片的初始化使用匿名结构(没有显式类型定义的结构)的跟踪指针可能会令人困惑。下面的示例说明了这一点:
<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>
初始化指针切片的语法类似于结构体切片的初始化,只是在元素类型之前添加 *。然而,在底层,该语法实际上是在编译时初始化具有指定类型的值切片的快捷方式。
<code class="go">f := []<type>{{...}, {...}}</code>
这相当于以下内容:
<code class="go">f := []<type>{<type>{...}, <type>{...}}</code>
如果是指针,则变为:
<code class="go">f := []*<type>{{...}, {...}}</code>
这等价to:
<code class="go">f := []*<type>{&<type>{...}, &<type>{...}}</code>
这意味着匿名结构语法可以方便地初始化指针切片。
但是,请注意,在初始化指针切片时,值可以是匿名结构类型,只要类型在切片内保持一致。
<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>
将匿名结构与常规结构混合和匹配不允许使用结构体,如下例所示:
<code class="go">e := []*Ex{{1, 2}, &Ex{3, 4}} // Syntax Error!</code>
出现这种情况是因为编译器无法从指向结构体的指针推断匿名结构体的类型。
以上是Go 如何处理具有匿名结构的指针切片的初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!