Je sais que je peux parcourir une carte m
en
for k, v := range m { ... }
et recherchez une clé, mais existe-t-il un moyen plus efficace de tester l'existence d'une clé dans une carte?
Je n'ai pas pu trouver la réponse dans la spécification de langue .
dictionary
go
go-map
grokus
la source
la source
Réponses:
Réponse en une ligne:
Explication:
if
Les instructions dans Go peuvent inclure à la fois une condition et une instruction d'initialisation. L'exemple ci-dessus utilise à la fois:initialise deux variables -
val
recevra soit la valeur de "foo" de la carte, soit une "valeur nulle" (dans ce cas, la chaîne vide) etok
recevra un bool qui sera définitrue
si "foo" était réellement présent dans la carteévalue
ok
, qui seratrue
si "foo" était dans la carteSi "foo" est bien présent dans la carte, le corps de l'
if
instruction sera exécuté etval
sera local à cette portée.la source
var val string = ""
restera le même,val, ok :=
crée une nouvelle variable locale avec le même nom qui n'est visible que dans ce bloc.if key in dict
.En plus de la spécification du langage de programmation Go , vous devriez lire Effective Go . Dans la section sur les cartes , ils disent, entre autres:
la source
Recherche sur la liste de diffusion de go-nuts et a trouvé une solution publiée par Peter Froehlich le 15/11/2009.
Ou, de façon plus compacte,
Notez qu'en utilisant cette forme de l'
if
instruction, les variablesvalue
etok
ne sont visibles qu'à l'intérieur desif
conditions.la source
_, ok := dict["baz"]; ok
. La_
pièce jette la valeur au lieu de créer une variable temporaire.Réponse courte
Exemple
Voici un exemple sur le Go Playground .
Réponse plus longue
Selon la section Cartes d' Efficace Go :
la source
Comme indiqué dans d'autres réponses, la solution générale consiste à utiliser une expression d'index dans une affectation du formulaire spécial:
C'est agréable et propre. Il a cependant quelques restrictions: il doit s'agir d'une cession de forme spéciale. L'expression de droite doit être uniquement l'expression d'index de mappage et la liste des expressions de gauche doit contenir exactement 2 opérandes, le premier auquel le type de valeur est attribuable et le second auquel une
bool
valeur est attribuable. La première valeur du résultat de ce formulaire spécial sera la valeur associée à la clé, et la deuxième valeur indiquera s'il existe réellement une entrée dans la carte avec la clé donnée (si la clé existe dans la carte). La liste des expressions de gauche peut également contenir l' identifiant vide si l'un des résultats n'est pas nécessaire.Il est important de savoir que si la valeur de carte indexée
nil
contient ou ne contient pas la clé, l'expression d'index est évaluée à la valeur zéro du type de valeur de la carte. Ainsi, par exemple:Essayez-le sur le Go Playground .
Donc, si nous savons que nous n'utilisons pas la valeur zéro dans notre carte, nous pouvons en profiter.
Par exemple, si le type de valeur est
string
, et nous savons que nous ne stockons jamais d'entrées dans la carte où la valeur est la chaîne vide (valeur nulle pour lestring
type), nous pouvons également tester si la clé est dans la carte en comparant les non spéciales forme de (résultat de) l'expression d'index à la valeur zéro:Sortie (essayez-la sur le Go Playground ):
Dans la pratique, il existe de nombreux cas où nous ne stockons pas la valeur zéro dans la carte, donc cela peut être utilisé assez souvent. Par exemple, les interfaces et les types de fonctions ont une valeur nulle
nil
, que nous ne stockons souvent pas dans les cartes. Il est donc possible de tester si une clé se trouve dans la carte en la comparant ànil
.L'utilisation de cette "technique" présente également un autre avantage: vous pouvez vérifier l'existence de plusieurs clés de manière compacte (vous ne pouvez pas le faire avec le formulaire spécial "virgule ok"). En savoir plus: Vérifiez si la clé existe dans plusieurs cartes dans une seule condition
L'obtention de la valeur zéro du type de valeur lors de l'indexation avec une clé non existante nous permet également d'utiliser des cartes avec des
bool
valeurs de manière pratique sous forme d' ensembles . Par exemple:Il sort (essayez-le sur le Go Playground ):
Voir aussi: Comment puis-je créer un tableau contenant des chaînes uniques?
la source
T
envar v, ok T = a[x]
? neok
doit pas être bool?map[bool]bool
et l'T
estbool
, mais cela fonctionne aussi si la carte est de typemap[interface{}]bool
et l'T
estinterface{}
; en outre, il fonctionne également avec des types personnalisés ayantbool
comme type sous-jacent, tout voir sur le Go Playground . Donc, puisque ce formulaire est valide avec plusieurs types substituésT
, c'est pourquoi le généralT
est utilisé. Le type deok
peut être tout ce à quoi un non typébool
peut être affecté.meilleure façon ici
la source
la source
Ensuite, lancez maps.go somestring existe? vrai n'existe pas? faux
la source
_, ok = m["somestring"]
devrait être=_, ok := m["somestring"]
Il est mentionné sous "Expressions d'index" .
la source
Une affectation à deux valeurs peut être utilisée à cet effet. Veuillez consulter mon exemple de programme ci-dessous
la source