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

Go は匿名構造体を使用したポインタのスライスの初期化をどのように処理しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 15:39:13355ブラウズ

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

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>

これは次と同等です:

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

これは、匿名構造体構文がポインタのスライスを初期化するのに便利であることを意味します。

ただし、ポインターのスライスを初期化する場合、スライス内で型が一貫している限り、値は匿名の構造体型であってもよいことに注意してください。

<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>

匿名の混合と一致次の例のように、通常の構造体を含む構造体は許可されません:

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

これは、コンパイラーが構造体へのポインターから匿名構造体の型を推論できないために発生します。

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

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