go-staticcheck发出警告:返回值被忽略.此问题仅在循环和特定条件内出现.让我澄清这一点:

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

到目前为止,林特没有抛出一个问题.但当我go 掉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是纯函数,但其返回值被忽略


编辑:

我发现很难忽视,因此粘贴在这里作为self 参考.以防我们需要忽略类似的短绒问题.

for _, key := range []string{"my-foo", "bar", "baz"} {
  //lint:ignore SA4017 // ignore this
  if strings.HasPrefix(key, "my") {
    continue
  }
}

注://lint之间没有空格.

推荐答案

您的continue只是在循环中运行,没有依赖于HasPrefix(bool)的结果的其他代码,所以实际上您只是在浪费调用.纯函数是不会产生任何副作用的函数,因此林特知道,在这种情况下,条件可以完全删除,不会有任何影响.

如果在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的结果.

Go相关问答推荐

为什么在GO中打印变量会导致堆栈溢出?

如何在AWS SDK Go v2 STS上正确使用重试

禁用Golang中的终端

错误.如果它包含切片,则返回FALSE

在不耗尽资源的情况下处理S3文件下载

Golang使用Run()执行的命令没有返回

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

将这两个函数合二为一的惯用方法

如何测试 Zerolog 记录器引发类型错误的日志(log)事件?

用接口来模拟amqp091go的困难

使用goroutines在Golang中验证 struct

Global Thread-local Storage 在 Go 中的可行性和最佳实践

GitHub 中 REST API 的 aws 凭证问题

如何在 `hashicorp / terraform-exec` 中将 `ApplyConfig` 传递给 `tf.Apply()`?

如何使用带有方法的字符串枚举作为通用参数?

如何修改go gin的默认端口?我的 8080 端口正在使用中

在删除级联时无法在 Gorm 中按预期工作

即使一个测试用例失败,如何运行所有测试用例

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

无法识别同步错误.使用一次