Golang菜鸟问题:为什么我可以not使用"%+v"
String() 实现方法中结构的标志?
我有一个结构,我想在其中实现String()
漂亮打印的方法。我喜欢给出的答案here https://stackoverflow.com/a/33252434,但我不喜欢打字,所以我尝试修改它以使用"%+v"
结构的格式标志。来自fmt https://golang.org/pkg/fmt doc:
%v 打印结构时默认格式的值,加号标志
(%+v) 添加字段名称
如果我简单地用它来调用它,效果很好fmt.Printf("%+v", color)
,但如果我尝试把+
标志在String()
实现时,我遇到了堆栈溢出(我第一次有机会在 stackoverflow.com 上提出“堆栈溢出”问题;))
我确定我不理解这里的指针引用,或者存在一些递归。我怀疑这个菜鸟发现了我的第一个 Golang bug,所以有人可以解释一下吗?
请参阅此处的 go play 演示https://play.golang.org/p/13_qI8Iwwa https://play.golang.org/p/13_qI8Iwwa
See 软件包 fmt 文档 https://golang.org/pkg/fmt/:
除非使用动词打印%T
and %p
, 特殊格式
注意事项适用于实现某些接口的操作数。
按申请顺序:
- 如果操作数实现方法
String() string
,将调用该方法将对象转换为字符串,然后将其
根据动词(如果有)的要求格式化。
为了避免在以下情况下递归
type X string
func (x X) String() string { return Sprintf("<%s>", x) }
在重复之前转换值:
func (x X) String() string { return Sprintf("<%s>", string(x)) }
自引用数据也可以触发无限递归
结构,例如包含自身作为元素的切片,如果
该类型有一个 String 方法。然而,这种病症很少见,而且
该包装不能防止它们。
Inside:
func (c Color) String() string {
// THIS CAUSES STACK OVERFLOW
return fmt.Sprint(c)
}
致电给
fmt.Sprint(c)
or fmt.Println(c)
哪个调用func (c Color) String() string
再次递归导致溢出:尝试一下围棋游乐场 https://play.golang.org/p/UKlhSlzG8T
这也很好用:https://play.golang.org/p/NYLtrxUeiA https://play.golang.org/p/NYLtrxUeiA
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)