想象一个困境:为结构体定义一个 String() 方法来提供自定义打印行为,但 fmt.Println 似乎忽略它,导致输出不可读。以下代码就是这种情况:
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) }
预期输出:
{bar bar} [bar] bar
实际输出:
{[0x176f44] 0x176f44} [bar] bar
这背后有两个关键因素行为:
要解决此问题,我们需要导出 bar 类型和 foo 字段。这是更正后的代码:
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
这确保了 Bar 及其 String() 方法都被导出,从而允许fmt.Println 来利用它。因此,我们获得了所需的输出:
{bar bar} [bar] bar
总之,请记住导出 String() 方法中涉及的类型和字段,以使 fmt.Println 能够利用这种强大的自定义格式化功能。
以上是为什么 `fmt.Println` 不使用我的 Struct 的 `String()` 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!