Maison >développement back-end >Golang >Pourquoi « fmt.Println » n'appelle-t-il pas toujours la méthode « String() » de mon type personnalisé ?

Pourquoi « fmt.Println » n'appelle-t-il pas toujours la méthode « String() » de mon type personnalisé ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-31 11:43:10441parcourir

Why Doesn't `fmt.Println` Always Call My Custom Type's `String()` Method?

Échec de l'invocation de méthode avec la conversion d'interface dans fmt.Println

Lors de la tentative d'utilisation de fmt.Println pour imprimer une valeur d'un type personnalisé, l'invocation attendue de la méthode String() du type peut ne pas se produire. Ce problème survient lorsque la valeur est transmise en tant que valeur plutôt qu'en tant que pointeur.

Considérez l'exemple de code :

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) // Value-based object
}

Dans ce cas, la méthode String() attendue de Car ne sera pas être appelé lorsque fmt.Println est utilisé avec une valeur de type Car. Au lieu de cela, la valeur sera formatée à l'aide du mécanisme de formatage Go par défaut.

Pour résoudre ce problème et garantir que la méthode String() personnalisée est invoquée, que l'objet soit une valeur ou un pointeur, les options suivantes sont disponibles :

  • Implémenter String() sur les types basés sur la valeur : bien que cette approche élimine le besoin de conversion manuelle, elle entraîne une performance pénalité due à la copie de l'objet à chaque fois que la méthode String() est appelée.
  • Toujours passer les pointeurs vers fmt.Println : En passant un pointeur vers fmt.Println, la fonction Println sera automatiquement déréférencez-le et invoquez la méthode String() sur la valeur sous-jacente. Cela garantit que le formatage souhaité est appliqué, que l'objet soit une valeur ou un pointeur :
fmt.Println(&myCar) // Pointer-based object

En respectant ces directives, vous pouvez appeler de manière fiable la méthode String() et contrôler le formatage des types personnalisés dans fmt.Println.

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