为什么不FMT。Println 在结构上调用时是否使用成员的 String() 方法?


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)
}

为什么结果是

{[0x176f44] 0x176f44} [bar] bar

而不是

{[酒吧] 酒吧} [酒吧] 酒吧

这背后有什么原因吗?它似乎易于实现并且具有良好的可读性。

你的代码中有几个问题。您可以在未导出的字段上定义String bar,您的字段也是未导出的。这有效:

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)
}

游乐场:https://play.golang.org/p/OhoIcB7cA3。

这也适用于*Bar .

最新更新