Maison > Article > développement back-end > Pourquoi « fmt.Println » n'utilise-t-il pas la méthode « String() » d'une structure à moins que la structure et la méthode ne soient exportées ?
Méthodes fmt.Println et String()
Pourquoi fmt.Println n'utilise-t-il pas les méthodes String() des membres lorsqu'il est invoqué sur une structure ? Examinons le mécanisme sous-jacent.
Considérez le code suivant :
import "fmt" type Bar struct{} func (b Bar) String() string { return "bar" } type Foo struct { B []*Bar BB *Bar } func main() { f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}} fmt.Println(f, f.B, f.BB) }
Ce code produit le résultat attendu :
{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar
Cependant, vous vous demandez peut-être pourquoi le résultat n'est pas le suivant :
{[bar] bar} [bar] bar
qui afficherait la représentation String() des membres au lieu de la mémoire adresses.
La raison réside dans la nature non exportée du type Bar et de sa méthode String(). Dans Go, les membres et méthodes non exportés ne sont accessibles que dans le package dans lequel ils sont définis. Puisque fmt.Println ne fait pas partie du même package, il ne peut pas accéder à ces éléments non exportés. Par conséquent, il recourt au comportement par défaut consistant à imprimer les adresses mémoire pour les types non intégrés.
Pour résoudre ce problème, vous devez exporter à la fois le type Bar et sa méthode String(). De plus, les champs de la structure Foo doivent également être exportés pour un encodage et un décodage JSON corrects.
Voici une version modifiée du code qui démontre l'approche correcte :
import "fmt" type Bar struct{} func (b Bar) String() string { return "bar" } type Foo struct { B []*Bar BB *Bar } func main() { f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}} fmt.Println(f) }
Avec ces modifications implémenté, le résultat sera désormais :
{[bar] bar} [bar] bar
Cet exemple souligne l'importance d'utiliser les types et méthodes exportés pour une intégration appropriée avec des formateurs tels que 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!