Maison > développement back-end > Golang > Pourquoi fmt.Println n'appelle-t-il pas la méthode Stringer de mon interface Stringer lors du passage d'un objet basé sur une valeur ?

Pourquoi fmt.Println n'appelle-t-il pas la méthode Stringer de mon interface Stringer lors du passage d'un objet basé sur une valeur ?

Susan Sarandon
Libérer: 2024-12-06 19:35:15
original
482 Les gens l'ont consulté

Why Doesn't fmt.Println Invoke My Stringer Interface's String Method When Passing a Value-Based Object?

Confusion de l'interface Stringer avec Println : comprendre les objets basés sur des valeurs et ceux basés sur des pointeurs

Question :

Dans un scénario où un objet implémente l'interface Stringer, pourquoi la méthode String de l'objet n'obtient-elle pas invoqué lors de l'utilisation de fmt.Println si l'objet est basé sur une valeur ?

Exemple de code :

Considérez le code Go suivant :

type Car struct {
    year int
    make string
}

func (c *Car) String() string {
    return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year)
}

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    fmt.Println(myCar)
}
Copier après la connexion

Lorsque myCar est un pointeur, la méthode String est invoquée comme prévu. Cependant, lorsque myCar est une valeur, le formatage Go par défaut est utilisé à la place.

Réponse :

La raison de ce comportement réside dans le fonctionnement des interfaces Go. Lorsque vous spécifiez un type qui implémente une interface (Stringer, dans ce cas), Go s'attend à ce que ce type soit le type exact de l'interface. Lorsque vous transmettez une valeur de type Car à fmt.Println, elle est implicitement convertie en interface{} et il n'y a pas de type Car dans le système de types interface{}. Au lieu de cela, il s'agit d'un type *Car (un pointeur vers Car).

La fonction fmt.Println utilise un commutateur de type pour déterminer comment imprimer la valeur en fonction de son type. Pour une interface Stringer, il vérifie si la valeur implémente la méthode String. Étant donné que Car (basé sur des valeurs) n'implémente pas String, le formatage par défaut est utilisé. Cependant, lorsque vous appelez explicitement myCar.String(), le compilateur le convertit automatiquement en (&myCar).String(), qui a le bon type *Car et appelle la méthode de formatage souhaitée.

Pour garantir que le l'objet est formaté comme vous le souhaitez quel que soit son type, vous avez deux options :

  1. Implémenter la chaîne sur la voiture (basée sur la valeur) : Cela nécessite créer une méthode String distincte pour Car qui fonctionne sur les récepteurs de valeurs, ce qui entraînerait une copie d'objet inutile.
  2. Passez toujours un pointeur vers fmt.Println : En utilisant fmt.Println(&myCar), vous vous assurez que la valeur transmise a le type *Car correct et que la méthode String sera invoquée comme prévu.

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