Maison >développement back-end >Golang >Pourquoi fmt.Println appelle-t-il Car.String() pour les pointeurs mais pas les valeurs ?
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!