Maison  >  Article  >  développement back-end  >  Pourquoi le modèle « virgule ok » n'est-il applicable que dans les contextes d'affectation lors du renvoi de plusieurs valeurs à partir d'une fonction Go ?

Pourquoi le modèle « virgule ok » n'est-il applicable que dans les contextes d'affectation lors du renvoi de plusieurs valeurs à partir d'une fonction Go ?

DDD
DDDoriginal
2024-11-07 09:37:03682parcourir

Why is the

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 type
  • Dans le cas d'affectations multi-valeurs, le paramètre allowCommaOk doit être défini sur true pour activer le modèle "virgule ok". Cependant, dans le compilateur Go, ce paramètre est systématiquement défini sur false.
  • Conséquences des retours multi-valeurs

Ce 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn