Maison  >  Article  >  développement back-end  >  Comment Go gère-t-il l'initialisation d'une tranche de pointeurs avec des structures anonymes ?

Comment Go gère-t-il l'initialisation d'une tranche de pointeurs avec des structures anonymes ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 15:39:13355parcourir

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

Initialisation d'une tranche de pointeurs avec des structures anonymes dans Go

Au chapitre 7.6 du texte "Go Programming Language", l'initialisation d'une tranche des pointeurs de piste utilisant des structures anonymes (structures sans définitions de type explicites) peuvent prêter à confusion. L'exemple suivant illustre cela :

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

La syntaxe d'initialisation d'une tranche de pointeurs ressemble à l'initialisation d'une tranche de structures, avec l'ajout de * avant le type d'élément. Cependant, sous le capot, la syntaxe est en fait un raccourci pour initialiser une tranche de valeurs avec un type spécifié au moment de la compilation.

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

Cela équivaut à ce qui suit :

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

Dans le cas des pointeurs, cela devient :

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

Ce qui équivaut à :

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

Cela signifie que la syntaxe de structure anonyme est pratique pour initialiser des tranches de pointeurs.

Cependant, notez que lors de l'initialisation d'une tranche de pointeurs, les valeurs peuvent être d'un type struct anonyme, tant que le type reste cohérent au sein de la tranche.

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

Mélange et correspondance anonyme les structures avec des structures régulières ne sont pas autorisées, comme dans cet exemple :

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

Cela se produit car le compilateur ne peut pas déduire le type de la structure anonyme à partir d'un pointeur vers une structure.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn