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

Go 为什么fmt.Println结构不使用它的String()方法';s成员,go,Go,结果为何如此 {[0x176f44]0x176f44}[bar]条 不是 {[bar]bar}[bar]bar 这背后有什么原因吗?它看起来很容易实现,而且可读性好。您的代码中有几个问题。如果在bar上定义未报告的Stirng,则字段也未报告。这项工作: package main import ( "fmt" ) type bar struct { } func (b bar) String() string { return "bar" } type foo struc

结果为何如此

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

不是

{[bar]bar}[bar]bar


这背后有什么原因吗?它看起来很容易实现,而且可读性好。

您的代码中有几个问题。如果在
bar
上定义未报告的
Stirng
,则字段也未报告。这项工作:

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

谢谢!你能解释一下为什么必须出口吗?如果它打印出一些内容,fmt.Println已经在使用反射来检查未报告的字段,那么为什么它不打印String()版本呢?json.Marshal类似,但未导出的字段不会被序列化。@HelinWang如果它打印
{}
,则它不会访问未报告的字段,它只知道它是一个结构。事实上,我认为您不能使用
reflect
访问未报告的字段。这就是为什么处理数据的包,如
fmt
encoding/json
需要导出字段。它打印
{[0x176f44]0x176f44}
。我想reflect可以访问未报告的字段:我想我读未报告的字段是错的。所以我真的不知道为什么它不使用
String()
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)
}