Comprendre le comportement de fmt.Println avec les membres de la structure
Dans Go, lorsque nous appelons fmt.Println sur une structure, nous nous attendons à ce qu'elle génère la représentation sous forme de chaîne des membres de la structure en utilisant leurs méthodes String() respectives. Cependant, ce n'est pas toujours le cas.
Considérons le 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) }
Dans ce code, nous définissons un type bar avec une méthode String() qui renvoie la chaîne "bar ". Nous définissons également un type foo avec les champs b et bb, qui sont respectivement des tranches et des pointeurs vers des types de barres.
Lorsque nous appelons fmt.Println sur f, f.b et f.bb, nous obtenons le résultat suivant :
{[0x176f44] 0x176f44} [bar] bar
C'est différent de ce à quoi on pourrait s'attendre, ce qui est :
{[bar] bar} [bar] bar
Raisons derrière le comportement de fmt.Println
Il y a plusieurs raisons pour lesquelles fmt.Println n'utilise pas la méthode String() des membres lorsqu'il est appelé sur une struct :
Solution
Pour résoudre ce problème, nous devons nous assurer que la méthode String() et les champs de la structure sont exportés. Voici le code corrigé :
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) }
Maintenant, lorsque nous exécutons le code, nous obtenons le résultat attendu :
{[bar] bar} [bar] bar
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!