为什么 fmt.Println 在结构上调用时不使用成员的 String() 方法?

Hel*_*ang 5 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)
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样的结果

{[0x176f44] 0x176f44} [栏] 栏

并不是

{[栏] 栏} [栏] 栏

背后有什么原因吗?它似乎很容易实现并且可读性良好。

Ain*_*r-G 4

您的代码中有几个问题。您定义未导出的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)
}
Run Code Online (Sandbox Code Playgroud)

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

这也适用于*Bar.