Détermination de l'existence d'une clé sur plusieurs cartes
Lorsque vous travaillez avec plusieurs cartes, il est souvent nécessaire de vérifier si une clé spécifique existe dans toutes eux. Bien que l'approche suivante soit courante :
if v1, ok1 := map1["aaa"]; ok1 { ... } if v2, ok2 := map2["aaa"]; ok2 { ... }
elle implique plusieurs instructions if. Existe-t-il une manière plus concise d'effectuer cette vérification dans une condition ?
Tentatives de syntaxe de condensation
Une solution possible consiste à évaluer l'existence de la clé dans les deux cartes, puis vérifier leur intersection :
v1, ok1 := map1["aaa"] v2, ok2 := map2["aaa"] if ok1 && ok2 { ... }
Cependant, cette approche nécessite d'attribuer et de vérifier deux étapes.
Limitations des vérifications de clés à condition unique
Il s'avère que le langage Go ne permet pas de vérifier l'existence de plusieurs clés dans une seule condition if. Selon la spécification Go, une expression d'index sur une carte génère une valeur booléenne supplémentaire indiquant la présence ou l'absence de la clé. Cette syntaxe spéciale ne peut être utilisée que lors d'une affectation ou d'une initialisation.
Par conséquent, il n'est pas possible d'effectuer une vérification combinée de l'existence d'une clé en utilisant uniquement la forme spéciale v, ok := m[k].
Alternatives pour les contrôles d'existence des clés
Si le type de valeur de la carte est un type d'interface et peut être garanti qu'il n'a pas de valeur nulle valeur, une approche alternative consiste à utiliser l'affectation de tuples pour vérifier l'existence de la clé :
if v1, v2 := m1["aaa"], m2["aaa"]; v1 != nil && v2 != nil { ... }
Pour les cas plus complexes, une fonction d'assistance peut être créée pour encapsuler la logique de vérification de l'existence de la clé :
func idx(m1, m2 map[string]interface{}, k string) ( v1, v2 interface{}, ok1, ok2 bool) { v1, ok1 = m1[k] v2, ok2 = m2[k] return } // Usage example: if v1, v2, ok1, ok2 := idx(m1, m2, "aaa"); ok1 && ok2 { ... }
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!