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
Libérer: 2024-12-16 11:42:11
original
375 Les gens l'ont consulté

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"
}
Copier après la connexion

É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).
Copier après la connexion

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"
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal