关于格式参数错误的正确的“ go vet”警告

时间:2018-08-16 23:26:07

标签: go

我有一个包含指向另一个结构的指针的结构。也就是说,

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

1 个答案:

答案 0 :(得分:3)

您有重复的名称{​​{1}}和s *InnerStructs fmt.State抱怨您使用的是动词形式go vet,而不是sv

修正您的错别字。例如,

fmt.Fprintf(s, "&%s", *s)

游乐场:https://play.golang.org/p/B2pAus3kEwt