代码之家  ›  专栏  ›  技术社区  ›  Bhojendra Rauniyar

linter警告:忽略返回值

  •  1
  • Bhojendra Rauniyar  · 技术社区  · 3 年前

    go-staticcheck 发出警告:忽略返回值。此问题仅出现在循环和特定条件中。让我澄清一下:

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

    到目前为止,林特尔还没有提出任何问题。但当我移除 fmt 和使用 continue 它抛出了一个问题:

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

    HasPrefix是一个纯函数,但其返回值被忽略

    此问题未显示为 strings.Contains() 。它仅与一起出现 strings.HasPrefix() 并且仅在使用时 持续 消息灵通的


    我也试过这样做:

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

    现在,它分为两个问题:

    hasMy的这个值从未使用过

    HasPrefix是一个纯函数,但其返回值被忽略


    编辑:

    我发现很难忽略,所以粘贴到这里以供参考。以防我们需要忽略类似的过梁问题。

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

    注意:中间没有空格 //lint

    2 回复  |  直到 3 年前
        1
  •  2
  •   Zac Anger    3 年前

    你的 continue 只是通过循环运行回来,没有其他代码取决于的结果 HasPrefix (a bool ),所以实际上你只是在浪费那个电话。纯函数是一个没有副作用的函数,所以linter知道在这种情况下,条件函数可以完全删除,不会有任何区别。

    如果您添加 else 在if语句之后,您可以看到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

    推荐文章