Valeurs de retour de la fonction Go : déchiffrer le modèle « Virgule Ok »
Dans Go, une fonction peut renvoyer plusieurs valeurs, ce qui peut être utile dans certains scénarios. Cependant, tous les retours à valeurs multiples ne sont pas valides. L'extrait de code suivant illustre un cas valide :
func FindUserInfo(id string) (Info, bool) { it, present := all[id] return it, present }
À l'inverse, ce code n'est pas valide :
func FindUserInfo(id string) (Info, bool) { return all[id] }
Pourquoi le premier exemple est-il valide alors que le second ne l'est pas ? Comprendre cela nécessite de se plonger dans une technique connue sous le nom de modèle « virgule ok ». L'expression ok" est utilisée pour distinguer une entrée manquante dans une carte d'une valeur nulle. Ce modèle est particulièrement répandu lors de l’accès à une clé de carte. Considérez ce qui suit :
Si la clé tz existe dans la carte timeZone, les secondes se verront attribuer la valeur correspondante et ok sera défini sur true. Sinon, les secondes seront définies sur 0 et ok sera défini sur false.
Détails de mise en œuvre : Plonger dans le code source de Go
var seconds int var ok bool seconds, ok = timeZone[tz]
Pour obtenir des éclaircissements, nous nous tournons vers celui de Go code source. La méthode unpack est responsable de la gestion des affectations et des retours à valeurs multiples. Il détermine si une expression spécifique peut être qualifiée de cas "virgule ok" en fonction des critères suivants :
Indexation d'une carte
Récupération d'une valeur d'un canal Effectuer une assertion de typeCe comportement implique que le modèle "virgule ok" peut être utilisé uniquement dans des contextes d’affectation. Pour récupérer plusieurs valeurs d'une fonction, les variables sur le côté gauche de l'affectation sont requises.
Exemple approfondi
Pour illustrer, nous examinons le vérificateur Méthode .initVars() :
Dans ce code, l'indicateur virguleOk n'est activé que lorsque le nombre de variables sur le côté gauche de l'affectation correspond au nombre de valeurs renvoyées par la fonction. Par conséquent, il est nécessaire de déclarer des variables pour chaque valeur à récupérer.
Conclusion
var x operand if commaOk { var a [2]Type for i := range a { get(&x, i) a[i] = check.initVar(lhs[i], &x, returnPos.IsValid()) } check.recordCommaOkTypes(rhs[0], a) return }
Le modèle "virgule ok" dans Go est un outil précieux pour discriminer entre les entrées de carte manquantes et les valeurs nulles. Cependant, son applicabilité est limitée aux contextes d'affectation, nécessitant l'utilisation de variables pour stocker les valeurs renvoyées. Comprendre ces contraintes garantit la mise en œuvre correcte et efficace des retours multi-valeurs dans le code Go.
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!