Maison >développement back-end >Golang >Pourquoi « fmt.Println » génère-t-il une « mauvaise erreur » au lieu de « 5 » lorsqu'une variable d'interface implémente l'interface « erreur » ?

Pourquoi « fmt.Println » génère-t-il une « mauvaise erreur » au lieu de « 5 » lorsqu'une variable d'interface implémente l'interface « erreur » ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-16 11:42:11376parcourir

Why Does `fmt.Println` Output

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!

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