go - go lint 工具范围关闭检测
问题描述
一直在尝试将gonnel用于一些隧道。试图打开 2 个隧道,然后当它们关闭时,我注意到日志包说试图关闭同一个隧道两次。通过查看代码,似乎(其中一个)问题是:
我想我会利用 staticcheck、golangci-lint 甚至去 vet 让它突出这个问题,这样我就可以更有信心进行修复。但是,当我运行这些工具时,会得到以下输出:
去看兽医:
静态检查:
还尝试使用 -loopclosure 运行 go vet,但我仍然没有得到任何输出。难道其中一个工具不应该说 go func 需要将迭代器变量作为参数传递吗?如果有帮助,我正在运行 go 1.14.3 darwin/amd64,并且还尝试在 goland 中导入代码,但我没有收到该段代码的检查警告。我有一种感觉,我可能做错了什么,你能发现它是什么吗?
谢谢!
解决方案
是,对的。这个问题在 Gophers 中很常见(作为 goroutine 运行的闭包会发生什么?)!
去兽医的问题:
因此,您似乎看不到 go vet 的输出,因为 goroutine 在一个if
块中。您可以尝试不使用if
障碍物吗?我认为您的问题更相关问题 21412
引用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
块是如何go vet
工作的差异化因素。
- 使用
if
块,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
阻塞,go vet
返回loop variable fruit captured by func literal
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()
}
推荐阅读
- mysql - Laravel 多连接计数
- python - 要锁定并用于运行余额计算的数据框单元格(后续问题)
- go - 与任意切片一起使用的交换实现
- php - 如何在 php 中的 cURL 响应中创建对象的 json
- microsoft-dynamics - D365 中的作业卡设备超时问题
- python - 我希望我的 tkinter 图像每 4 秒出现一次,而不是一次全部出现
- python - 为什么导入健身房不能使用 python 文件
- enums - micronaut 是否支持将枚举字段加载为 Bean 定义?
- r - 使用 dplyr spread 后润滑期变得混乱
- arrays - jq:错误(在
:1): 无法用字符串“name”索引数组 已解决