Understanding fmt.Println's Behavior with Struct Members
In Go, when we call fmt.Println on a struct, we expect it to output the string representation of the struct's members using their respective String() methods. However, this is not always the case.
Consider the following code:
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) }
In this code, we define a bar type with a String() method that returns the string "bar." We also define a foo type with fields b and bb, which are slices and pointers to bar types, respectively.
When we call fmt.Println on f, f.b, and f.bb, we get the following output:
{[0x176f44] 0x176f44} [bar] bar
This is different from what we would expect, which is:
{[bar] bar} [bar] bar
Reasons Behind fmt.Println's Behavior
There are a few reasons why fmt.Println does not use the String() method of members when called on a struct:
Solution
To fix this, we need to make sure that the String() method and the fields in the struct are exported. Here's the corrected code:
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) }
Now, when we run the code, we get the expected output:
{[bar] bar} [bar] bar
The above is the detailed content of Why Doesn\'t fmt.Println Use a Struct\'s Member String() Methods in Go?. For more information, please follow other related articles on the PHP Chinese website!