Go语言 短绒警告:返回值被忽略

s2j5cfk0  于 2023-05-11  发布在  Go
关注(0)|答案(1)|浏览(172)

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之间没有空格。

f4t66c6m

f4t66c6m1#

您的continue只是在循环中运行,没有其他代码依赖于HasPrefix的结果(一个bool),因此实际上您只是浪费了那个调用。纯函数是一个不执行任何副作用的函数,因此linter知道在这种情况下,条件可以完全删除,不会产生任何影响。
如果在if语句后添加else,可以看到lint警告消失(在我的机器上,错误消息略有不同,但可能是不同版本的staticcheck)。

for _, key := range []string{"my-foo", "bar", "baz"} {
    if strings.HasPrefix(key, "my") {
        continue
    } else {
        fmt.Println("hello")
    }
}

或者,如果你像第一个版本一样在检查中添加其他内容:

for _, key := range []string{"my-foo", "bar", "baz"} {
    if strings.HasPrefix(key, "my") {
        fmt.Println("yep")
        continue
    }
}

这同样适用于使用变量存储HasPrefix结果的第二个版本。

相关问题