gpt4 book ai didi

go lint 工具范围关闭检测

转载 作者:行者123 更新时间:2023-12-01 19:47:00 25 4
gpt4 key购买 nike

一直在尝试使用gonnel对于一些隧道。试图打开 2 个隧道,然后当它们关闭时,我注意到日志包说正在尝试关闭同一个隧道两次。从代码来看,似乎(其中一个)问题是这样的: enter image description here

我想我会利用 staticcheck、golangci-lint 甚至 go vet 来突出显示这个问题,这样我就可以更有信心地进行修复。但是,当我运行这些工具时,我得到了这个输出:

golangci-lint: enter image description here

去 vert :

enter image description here

静态检查:

enter image description here

还尝试使用 -loopclosure 运行 go vet,但我仍然没有得到任何输出。难道其中一个工具不应该说 go func 需要迭代器变量作为参数传递吗?如果有帮助,我正在运行 go 1.14.3 darwin/amd64,并尝试在 goland 中导入代码,但我没有收到那段代码的检查警告。我感觉我可能做错了什么,你能看出是什么吗?

谢谢!

最佳答案

是的,正确的。这个问题在 Gophers ( What happens with closures running as goroutines? ) 中很常见!

去 vert 的问题:

  1. https://github.com/golang/go/issues/21412
  2. https://github.com/golang/go/issues/16520

因此,您似乎看不到 go vet 的输出,因为 goroutine 在 if block 中。您可以尝试不使用 if block 吗?我认为你的问题更相关Issue 21412


同样适用于 golangci/govet :

引用golangci/govet/rangeloop.go的代码:

This file contains the code to check range loop variables bound inside function
literals that are deferred or launched in new goroutines. We only check
instances where the defer or go statement is the last statement in the loop
body, as otherwise, we would need whole-program analysis.

此外,我的建议是检查隧道是否打开,然后仅将其关闭。您可能会重复条目,因此可能会再次出现问题。并首先修复作为 goroutine 错误运行的闭包。

因此,这是一个示例,其中 if block 是 go vet 工作方式的区别因素。

  • 使用 if block ,go vet 不返回任何内容
package main

import (
"fmt"
"sync"
)

func main() {
fruits := []string{"orange", "apple"}
var wg sync.WaitGroup
for _, fruit := range fruits {
if true {
wg.Add(1)
go func() {
fmt.Println(fruit)
wg.Done()
}()
}
}
wg.Wait()
}
  • 没有 if block ,go vet 返回 由 func literal 捕获的循环变量 fruit
package main

import (
"fmt"
"sync"
)

func main() {
fruits := []string{"orange", "apple"}
var wg sync.WaitGroup
for _, fruit := range fruits {
wg.Add(1)
go func() {
fmt.Println(fruit)
wg.Done()
}()
}
wg.Wait()
}

关于go lint 工具范围关闭检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62397275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com