在Go中,一个结构体如果含有一个指针字段,在默认情况下,使用fmt.Print系列函数打印这个结构体时,并不会打印这个指针指向的值。因此,对于下面的代码:
type Foo struct {
A int
}
type Bar struct {
F *Foo
}
func main() {
b := Bar{
&Foo{
1}}
fmt.Printf("%+v\n", b)
}
其输出为:
{F:0xc0000140a0}
map也是类似的,如果map的value类型为指针,fmt.Print系列函数同样不会打印指针指向的值。
如果想要把指针的值打印出来,那么这个指针指向的类型需要实现fmt.Stringer接口:

在Go语言中,fmt.Println等函数默认不会打印结构体中指针字段所指向的值,这是为了避免陷入无限循环。当打印包含指针的结构体时,只有在最外层(depth为0)时才会尝试打印指针的值。如果指针指向的类型实现了fmt.Stringer接口,那么可以自定义打印方式显示指针内容。博客通过代码示例解释了这一行为,并展示了如何通过实现String方法来打印指针的值。

564

被折叠的 条评论
为什么被折叠?



