Interfaces Golang : comprendre le résultat inattendu d'une « mauvaise erreur »
Dans Go, les interfaces fournissent un mécanisme permettant de définir et de mettre en œuvre des méthodes communes dans différents genres. Cependant, une situation intrigante survient lorsqu'un type d'interface définit une méthode Error() et est affecté à une variable d'interface.
Considérez l'extrait de code suivant :
type T int func (t T) Error() string { return "bad error" } func main() { var v interface{} = T(5) fmt.Println(v) // Output: "bad error", instead of "5" }
Étonnamment, le résultat de le code ci-dessus est "mauvaise erreur" au lieu de la valeur attendue de 5. Cela se produit car fmt.Println() appelle implicitement la méthode Error() si l'opérande implémente l'interface d'erreur.
Comme indiqué dans la documentation du package fmt :
If an operand implements the error interface, the Error method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).
L'interface d'erreur définit une seule méthode, Error(), qui renvoie une chaîne décrivant l'erreur. Lorsque v est imprimé, il est traité selon le spécificateur de format %v, qui appelle automatiquement la méthode Error() si elle est présente.
Pour obtenir le résultat souhaité, on peut utiliser la fonction Printf() avec un spécificateur de format, tel que %d pour les entiers :
fmt.Printf("%d", v) // Output: "5"
En résumé, lors de l'attribution de types avec des méthodes Error() définies pour interfacer des variables, il faut être conscient du potentiel de "mauvais" inattendus error" s'affiche lors de l'utilisation de la famille de fonctions Printf() avec un formatage d'argument implicite.
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!