Maison >développement back-end >Golang >Pourquoi « fmt.Println » n'appelle-t-il pas ma méthode d'interface Stringer lors de l'utilisation d'un objet non-pointeur ?

Pourquoi « fmt.Println » n'appelle-t-il pas ma méthode d'interface Stringer lors de l'utilisation d'un objet non-pointeur ?

DDD
DDDoriginal
2024-12-06 08:51:18523parcourir

Why Doesn't `fmt.Println` Call My Stringer Interface Method When Using a Non-Pointer Object?

Pourquoi ma méthode d'interface Stringer n'est-elle pas invoquée lorsque j'utilise fmt.Println ?

Lorsqu'ils travaillent avec l'interface Stringer de Go, les utilisateurs peuvent rencontrer des situations où leur String( ) n'est pas appelée lors du passage d'objets non pointeurs à fmt.Println. Pour faire la lumière sur ce comportement, examinons le code suivant :

package main

import "fmt"

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)
}

Ici, nous définissons une structure Car et implémentons la méthode String() comme méthode de valeur. Cependant, lorsque nous passons myCar comme argument à fmt.Println, l'objet est converti en interface{}. Cela amène le package fmt à utiliser son propre formatage par défaut, en contournant notre méthode String().

La clé pour comprendre ce comportement réside dans le fait que nous avons implémenté la méthode String() sur un récepteur de pointeur (* Voiture). Lors du passage d’une valeur de type Car, le compilateur ne la convertit pas automatiquement en pointeur. Par conséquent, le package fmt ne peut pas faire correspondre notre méthode String() à la valeur que nous avons transmise.

Au lieu de cela, pour appeler notre méthode String() lors du passage d'un objet non-pointeur, nous devons convertir manuellement la valeur en un pointeur à l'aide de l'opérateur & :

fmt.Println(&myCar)

Ce faisant, nous transmettons un pointeur vers l'objet Car à fmt.Println. Cela permet d'invoquer la méthode String() du récepteur de valeur et d'appliquer notre formatage personnalisé.

En résumé, lorsque vous travaillez avec l'interface Stringer, il est important de se rappeler que la méthode doit être définie sur le bon récepteur. taper. Pour les pointeurs, un récepteur de pointeur est approprié, tandis que pour les types de valeur, un récepteur de valeur peut être utilisé. Si le passage manuel d'un pointeur n'est pas souhaitable, on peut envisager d'implémenter la méthode String() comme méthode de pointeur sur la structure Car réelle.

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