Éléments clés de l'initialisation du tableau de golang

Dans un pub quiz par Dave Cheney je suis tombé sur la suite à construire:

a := [...]int{5, 4: 1, 0, 2: 3, 2, 1: 4}
fmt.Println(a)

>> [5 4 3 2 1 0]

( Aire De Jeux Lien )

il semble que vous puissiez utiliser des clés dans les champs d'initialisation d'un tableau ( 4: 1, 0 signifie élément défini à l'index 4 à 1, élément à l'index 5 à 0). Je n'ai jamais vu quelque chose comme ça avant. Qu'est-ce que son cas d'utilisation? Pourquoi ne pas définir l'indice en question directement?

3
demandé sur icza 2016-03-30 10:35:10

2 réponses

Dans composite littéraux la clé (index dans le cas de la matrice et une tranche de littéraux) peuvent être fournies en option.

pour les tableaux et les tranches littérales, les règles suivantes s'appliquent:

  • chaque élément a un indice entier associé indiquant sa position dans le tableau.
  • un élément avec une clé utilise la clé comme son index; la clé doit être une expression entière constante.
  • un élément sans clé utilise l'index de l'élément précédent plus un. Si le premier élément n'a pas de clé, son indice est zéro.

Éléments d'obtenir la valeur zéro le type de l'élément dont la valeur n'est pas spécifiée.

Vous pouvez l'utiliser pour:

  • initialiser de façon plus compacte les tableaux et les tranches si le tableau / tranche a beaucoup de valeurs zéro et seulement quelques valeurs non nulles

  • sauter ("sauter") les parties contiguës lors de l'énumération des éléments, et les éléments sautés seront initialisés avec les valeurs zéro

  • spécifiez le premier couple d'éléments, et spécifiez encore la longueur (indice max + 1) que vous voulez que le tableau / tranche ait:

    a := []int{10, 20, 30, 99:0} // Specify first 3 elements and set length to 100
    

le spec contient également un exemple: créer un tableau qui indique si un caractère est une voyelle. C'est une façon très compacte et parlante d'initialiser le tableau:

// vowels[ch] is true if ch is a vowel
vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}

un autre exemple: créons une tranche qui dit si un jour est un week-end; le lundi étant 0, le mardi étant 1, ... et dimanche 6:

weekend := []bool{5: true, 6: true} // The rest will be false

ou encore mieux, vous pouvez même omettre le 2e indice ( 6 ) car il sera implicitement 6 (précédent +1):

weekend := []bool{5: true, true} // The rest will be false
4
répondu icza 2016-03-30 09:31:38

si vos indices de tableau sont clairsemés, il est plus court que faire {1,0,0,0,0,2,0,0,0,0,3} etc, et il est plus court que les lignes d'affectation multiples, donc je devine que c'est le cas d'utilisation.

je n'ai jamais vu cette syntaxe utilisée avant n'importe où.

3
répondu Not_a_Golfer 2016-03-30 07:43:40