Golang の匿名構造体を使用したポインターのスライスの初期化
GOPL の第 7 章 (セクション 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>
これは、Track タイプがすでに定義されており、構文 {1, 2} が新しい名前のない構造体を初期化しているように見えるため、混乱して見えるかもしれません。ただし、この構文は、構造体を明示的に定義せずにスライス タイプの要素を初期化するために使用されるショートカットです。
「{}」表記は本質的に次と同等です。
<code class="go">type Ex struct { A, B int } a := []Ex{Ex{1, 2}, Ex{3, 4}}</code>
ここで、型名(Ex)は省略しています。この構文は、ポインターのスライスを初期化する場合でも機能します。
<code class="go">c := []*Ex{&Ex{1, 2}, &Ex{3, 4}} d := []*Ex{{1, 2}, {3, 4}} e := []*Ex{{1, 2}, &Ex{3, 4}}</code>
これらの場合、& 演算子はポインターを作成するために匿名構造体に自動的に適用されます。
ただし、匿名構造体への参照を含むポインターのスライス (& 演算子なし) は構文エラーになります:
<code class="go">f := []*Ex{&{1, 2}, &{3, 4}} // Syntax Error!</code>
匿名構造体を使用してポインターのスライスを初期化するには、匿名構造体を変換する必要があります。
<code class="go">f := []struct{ A, B int }{ {1, 2}, {3, 4} } // or with pointers... g := []*struct{ A, B int }{ {1, 2}, {3, 4} }</code>
ここでは、個別の型定義を必要とせずに、匿名構造体がポインターのスライス内に埋め込まれています。この構文は、Golang のマップやその他のコレクションの匿名構造体を初期化するためによく使用されます。
以上がGolangで匿名構造体を使用してポインタのスライスを初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。