go-staticcheck
发出警告:返回值被忽略。此问题仅出现在循环和特定条件中。让我澄清一下:
for _, key := range []string{"my-foo", "bar", "baz"} {
if strings.HasPrefix(key, "my") {
fmt.Println(true)
}
}
直到现在,linter还没有抛出一个问题。但是当我删除fmt
并使用continue
时,它抛出了问题:
for _, key := range []string{"my-foo", "bar", "baz"} {
if strings.HasPrefix(key, "my") {
continue
}
}
HasPrefix是一个纯函数,但其返回值被忽略strings.Contains()
未出现此问题。它只出现在strings.HasPrefix()
和在循环中使用continue
时。
我也是这样尝试的:
for _, key := range []string{"my-foo", "bar", "baz"} {
hasMy := strings.HasPrefix(key, "my")
if hasMy {
continue
}
}
现在,它包含两个问题:
hasMy的这个值从未被使用
HasPrefix是一个纯函数,但其返回值被忽略
编辑:
我发现很难忽视,因此粘贴在这里供自我参考。以防我们需要忽略类似的linter问题。
for _, key := range []string{"my-foo", "bar", "baz"} {
//lint:ignore SA4017 // ignore this
if strings.HasPrefix(key, "my") {
continue
}
}
注意://lint
之间没有空格。
1条答案
按热度按时间f4t66c6m1#
您的
continue
只是在循环中运行,没有其他代码依赖于HasPrefix
的结果(一个bool
),因此实际上您只是浪费了那个调用。纯函数是一个不执行任何副作用的函数,因此linter知道在这种情况下,条件可以完全删除,不会产生任何影响。如果在if语句后添加
else
,可以看到lint警告消失(在我的机器上,错误消息略有不同,但可能是不同版本的staticcheck)。或者,如果你像第一个版本一样在检查中添加其他内容:
这同样适用于使用变量存储
HasPrefix
结果的第二个版本。