Maison > Article > développement back-end > Pourquoi « fmt.Println » n'utilise-t-il pas la méthode « String() » de ma Struct ?
Imaginez un dilemme : vous définissez une méthode String() pour qu'une structure fournisse des comportement d'impression, mais fmt.Println semble l'ignorer, vous laissant avec une sortie illisible. C'est le cas du code suivant :
package main 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) }
Sortie attendue :
{bar bar} [bar] bar
Sortie réelle :
{[0x176f44] 0x176f44} [bar] bar
Il y a deux facteurs clés derrière ce comportement :
Pour résoudre ce problème, nous devons exporter à la fois le type de barre et les champs foo. Voici le code corrigé :
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) }
Playground : https://play.golang.org/p/OhoIcB7cA3
Cela garantit que Bar et sa méthode String() sont exportés, permettant fmt.Println pour l'utiliser. Par conséquent, nous obtenons le résultat souhaité :
{bar bar} [bar] bar
En conclusion, n'oubliez pas d'exporter à la fois les types et les champs impliqués dans la méthode String() pour permettre à fmt.Println de tirer parti de cette puissante fonctionnalité de formatage personnalisé.
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!