我有一个包含指向另一个结构的指针的结构。也就是说,
type InnerStruct struct {
whatever bool
}
type OuterStruct struct {
is *InnerStruct
}
如果我用OuterStruct
打印出%+v
的实例,则内部结构不会像它不是指针那样展开。我理解并接受为什么会这样,但是由于我没有递归的机会,所以我希望将完整的内容打印出来。
我突然想到,我可以在Formatter
的指针接收器上实现InnerStruct
接口,以获得我想要的行为,实际上,以下内容确实可以实现我想要的功能,至少在我遇到的情况下(也许有一些方法可能会导致严重错误;请告诉我!):
func (is *InnerStruct) Format(s fmt.State, verb rune) {
switch verb {
case 'v':
if s.Flag('+') {
fmt.Fprintf(s, "&%+v", *is)
} else if s.Flag('#') {
fmt.Fprintf(s, "&%#v", *is)
} else {
fmt.Fprintf(s, "&%v", *is)
}
case 's':
fmt.Fprintf(s, "&%s", *is)
}
}
但是当我在代码上运行go vet
时,它会抱怨:
./thing.go:341: Fprintf format %s has arg *s of wrong type thing.InnerStruct
是否有更好的方法来获取结构的默认字符串表示形式,从而避免使用vet
出现此问题?
FWIW,我尝试过go-spew
,并(几乎)获得了我想要的确切输出,因此我可能只是沿这条路线走了,但我仍然想知道如果有的话完成以满足vet
。
答案 0 :(得分:3)
您有重复的名称{{1}}和s *InnerStruct
。 s fmt.State
抱怨您使用的是动词形式go vet
,而不是s
:v
。
修正您的错别字。例如,
fmt.Fprintf(s, "&%s", *s)