Que signifie «_» (virgule de soulignement) dans une déclaration Go?

100

Et je n'arrive pas à comprendre ce genre de déclaration de variable:

_, prs := m["example"]

Que fait exactement " _," et pourquoi ont-ils déclaré une variable comme celle-ci au lieu de

prs := m["example"]

(Je l'ai trouvé dans le cadre de Go by Example: Maps )

Kansuler
la source
3
Pour de futures questions linguistiques, veuillez d'abord consulter les spécifications . Il devrait répondre à toutes vos questions.
fuz le
En commentaire: prssignifie probablement "présent". Le code de votre exemple vérifie la présence ou l'absence d'une entrée "example"dans la mcarte.
dyoo le
6
@FUZxxl Oui, j'y ai jeté un coup d'œil auparavant, mais comme je ne connaissais pas le nom de la fonctionnalité, je ne l'ai pas trouvée. Je trouve également que les spécifications officielles des langages de programmation ne sont pas très pédagogiques et apprennent plutôt par l'exemple.
Kansuler
@dyoo Une fois que j'ai eu l'explication ci-dessous, j'ai compris sa signification, mais il convient de noter si quelqu'un d'autre a la même question!
Kansuler le
8
@FUZxxl: Je ne sais pas. La plupart des questions posées sur SO ont probablement des réponses disponibles quelque part. Il existe un certain seuil en dessous duquel une question ne devrait probablement pas être posée, mais je ne pense pas que cette question tombe en dessous.
jeudi

Réponses:

120

Cela évite d'avoir à déclarer toutes les variables pour les valeurs de retour.
C'est ce qu'on appelle l' identifiant vierge .

Un péché:

_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate

(l' autre ' _' cas d'utilisation est pour l'importation )

Puisqu'il ignore la valeur de retour, il est utile lorsque vous souhaitez vérifier une seule des valeurs renvoyées, comme dans " Comment tester l'existence d'une clé dans une carte? " Affiché dans " Effective Go, map ":

_, present := timeZone[tz]

Pour tester la présence dans la carte sans vous soucier de la valeur réelle, vous pouvez utiliser l'identifiant vide, un simple trait de soulignement ( _).
L'identificateur vide peut être attribué ou déclaré avec n'importe quelle valeur de n'importe quel type, la valeur étant rejetée sans danger.
Pour tester la présence dans une carte, utilisez l'identificateur vide à la place de la variable habituelle de la valeur.

Comme l' ajoute Jsor dans les commentaires :

"la norme généralement acceptée" consiste à appeler les variables de test d'appartenance "ok" (idem pour vérifier si une lecture de canal était valide ou non)

Cela vous permet de le combiner avec test:

if _, err := os.Stat(path); os.IsNotExist(err) {
    fmt.Printf("%s does not exist\n", path)
}

Vous le trouverez également en boucle:

Si vous n'avez besoin que du deuxième élément de la plage (la valeur), utilisez l'identificateur vide, un trait de soulignement, pour ignorer le premier:

sum := 0
for _, value := range array {
    sum += value
}
VonC
la source
Merci d'avoir donné un bon exemple. Il m'a fallu réfléchir pour comprendre le concept, mais maintenant je le fais!
Kansuler
Notez que l'IME "standard généralement accepté" consiste à appeler les variables de test d'appartenance "ok" (idem pour vérifier si une lecture de canal était valide ou non).
LinearZoetrope
1
@Jsor je suis d'accord. J'ai inclus votre commentaire dans la réponse pour plus de visibilité, et ajouté quelques exemples supplémentaires.
VonC le
63

Le compilateur Go ne vous permettra pas de créer des variables que vous n'utilisez jamais.

for i, value := range x {
   total += value
}

Le code ci-dessus renverra un message d'erreur "J'ai déclaré et non utilisé".

Puisque nous n'utilisons pas i dans notre boucle, nous devons le changer en ceci:

for _, value := range x {
   total += value
}
Juni Brosas
la source
12
Votre première phrase était importante pour comprendre la raison pour laquelle il y a un _ comme identifiant vide.
Tarik
4

_est l'identifiant vide. Cela signifie que la valeur à attribuer est ignorée.

Ici, c'est la valeur de la exampleclé qui est ignorée. La deuxième ligne de code rejetterait le booléen de présence et stockerait la valeur dans prs.
Donc, pour vérifier uniquement la présence sur la carte, vous pouvez ignorer la valeur. Cela peut être utilisé pour utiliser une carte comme un ensemble.

ThinkChaos
la source
3

L'identificateur vide peut être utilisé chaque fois que la syntaxe requiert un nom de variable mais pas la logique du programme, par exemple pour ignorer un index de boucle indésirable lorsque nous n'avons besoin que de la valeur de l'élément.

Extrait:

Le langage de programmation Go (Addison-Wesley Professional Computing Series)

Brian W. Kernighan

Ce matériel peut être protégé par le droit d'auteur.

koopertrooper
la source
2

Il s'appelle l'identificateur vide et cela aide dans les cas où vous souhaitez ignorer la valeur qui va être retournée et ne pas la référencer

Quelques endroits où nous l'utilisons:

  • Une fonction renvoie une valeur et vous n'avez pas l'intention de l'utiliser à l'avenir
  • Vous voulez itérer et avez besoin d'une valeur i que vous n'utiliserez pas
Anagha
la source
2

Le grand cas d'utilisation de la variable inutilisée est la situation où vous n'avez besoin que d'une sortie partielle. Dans l'exemple ci-dessous, il suffit d'imprimer la valeur (état de la population).

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}
monkrus
la source
1

Fondamentalement, _,connu sous le nom d'identifiant vide. Dans GO, nous ne pouvons pas avoir de variables qui ne sont pas utilisées.

En tant qu'instance lorsque vous parcourez un tableau si vous utilisez value: = range, vous ne voulez pas de i valeur pour l'itération. Mais si vous omettez la valeur i, il renverra une erreur. Mais si vous déclarez i et ne l'avez pas utilisé, cela renverra également une erreur.

C'est donc là que nous devons utiliser _,.

Il est également utilisé lorsque vous ne voulez pas de valeur de retour d'une fonction à l'avenir.

Jacinthe de Kaveen
la source
0

Une variable inutilisée n'est pas autorisée dans Golang

Si vous venez d'autres langages de programmation, cela peut sembler un peu difficile de s'y habituer. Mais cela se traduit par un code plus propre. Donc, en utilisant a, _nous disons que nous savons qu'il y a une variable là-bas, mais nous ne voulons pas l'utiliser et dire au compilateur qu'il ne m'en plaint pas. :)

PC Krishnadas
la source