在使用Go反射的代码中,用户打印类型是很常见的。然而,人们(习惯性地)很容易在使用%T时使用reflect.Type
,而实际上应该使用%v
。
例如:
t := reflect.TypeOf(...)
if checkValid(t) {
panic(fmt.Sprintf("invalid type: %T", t)) // incorrect: should be using %v
}
在代码审查过程中,很难检测到错误的动词。
在类似的情况下,我认为我从未见过一个人实际上想要打印reflect.Type
本身的类型(顺便说一下,它是*reflect.rtype
,对用户来说并不特别有趣)。
\cc @dominikh,以防这是一种更适合于staticcheck
而不是vet的检查。
3条答案
按热度按时间qvtsj1bj1#
我认为这对于精确性和正确性来说是没问题的。关于频率,我不太确定;这个bug在实践中出现得有多频繁?我想我之前看到过这个bug一两次,这让我觉得它比其他很多兽医检查要少得多,但也许我的经验是有偏见的。
ubbxdtey2#
在示例代码中有一个拼写错误:缺少闭合的双引号。
smdncfj33#
感谢指出拼写错误。我已经更新了示例。