ホームページ  >  記事  >  バックエンド開発  >  Go のスライスとマップの初期化構文は匿名構造をどのように処理しますか?

Go のスライスとマップの初期化構文は匿名構造をどのように処理しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 02:34:40726ブラウズ

How does Go's initialization syntax for slices and maps handle anonymous structures?

スライスとマップのための Golang の初期化構文

Go では、スライスとマップの宣言と初期化に匿名構造が関与する可能性があり、これにより問題が発生する可能性があります。混乱。これらの初期化手法の微妙な違いを詳しく見てみましょう。

説明のために、GOPL の第 7 章の次の行を考えてみましょう。

<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 ポインターのスライスを定義します。スライスの初期化では、要素は明示的な型宣言のない匿名構造体のように見えます。ただし、Go では、構文ショートカットを使用してこれらの構造を初期化できます。

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

この構文は実質的に次と同等です。

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

whereポインタを含む任意の型を表すことができます。したがって、トラック スライスの場合、次の初期化が有効です:

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

これは次と同等です:

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

この構文はマップにも適用されます:

<code class="go">f := map[string]<type>{"a": {...}, "b": {...}} // equivalent to
f := map[string]<type>{"a": &<type>{...}, "b": &<type>{...}}</code>

一方、匿名構造体は、個別の型定義のない構造体を指します。匿名型は、構造自体にのみ名前がない匿名構造とは異なります。真の匿名構造体は次のように記述されます:

<code class="go">f := []struct{
    A, B int
}{
    {1, 2}, {3, 4}
}</code>

この場合、リスト内の構造体には型定義がなく、匿名で参照されます。初期化の省略表現を使用すると、名前付き型を使用せずにこの構造体を簡単に初期化できます。

以上がGo のスライスとマップの初期化構文は匿名構造をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。