为什么fmt.Println结构不使用它的成员的String()方法

时间:2017-03-15 16:33:32

标签: go

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

  

{[bar] bar} [bar] bar

背后有什么理由吗?它似乎易于实现,并且具有可读性。

1 个答案:

答案 0 :(得分:4)

您的代码中存在多个问题。您在Stirng上定义了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