Go 为什么fmt.Println结构不使用它的String()方法';s成员
结果为何如此 {[0x176f44]0x176f44}[bar]条 不是 {[bar]bar}[bar]barGo 为什么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
这背后有什么原因吗?它看起来很容易实现,而且可读性好。您的代码中有几个问题。如果在
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)
}