Maison >développement back-end >Golang >Pourquoi fmt.Println appelle-t-il Car.String() pour les pointeurs mais pas les valeurs ?

Pourquoi fmt.Println appelle-t-il Car.String() pour les pointeurs mais pas les valeurs ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-07 06:42:14400parcourir

Why Does fmt.Println Invoke Car.String() for Pointers but Not Values?

String() invoquée pour imprimer des objets avec fmt.Println

Lors de l'utilisation des interfaces fmt.Println et Stringer, comprendre le processus de conversion de type est crucial.

Dans le code fourni, Car.String() est invoqué lors de la gestion des pointeurs, mais pas lors de l'utilisation valeurs. En effet, fmt.Println force à la fois les pointeurs et les valeurs dans un type interface{}.

fmt effectue ensuite un changement de type pour déterminer comment imprimer la valeur. Pour les valeurs implémentant fmt.Stringer (avec une méthode String renvoyant une chaîne), il imprime le résultat de cette méthode. Cependant, pour les valeurs avec une méthode String définie sur le type pointeur, le changement de type échoue.

Résolution :

Pour résoudre ce problème, implémentez String sur le type Car ou passez un pointeur vers fmt.Println, comme indiqué ci-dessous :

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) // Passing the pointer explicitly
}

Vous pouvez également utiliser une assertion de type personnalisée pour manuellement invoquez String, mais cette approche n'est pas recommandée :

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    if v, ok := myCar.(fmt.Stringer); ok {
        fmt.Println(v.String()) // Manually invoking String
    }
}

En abordant le comportement de conversion de type de fmt.Println, vous pouvez contrôler efficacement la façon dont les objets sont formatés, quelle que soit leur valeur ou la nature de leur pointeur.

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