我使用golangci-lint作为我的CI/CD的一部分,它抱怨SQL行没有被关闭,尽管它是从一个goroutine关闭的:
....
rows, err := ...
...
go funcThatDoesSomethingWithRows(rows)
}
...
func funcThatDoesSomethingWithRows(rows *sql.Rows) {
defer rows.Close()
我得到的信息是
行/语句未关闭(sqlclosecheck)
这真的是一个不好的模式,我应该避免这样做,还是golangci-lint的一个bug?我怎样才能让golangci-lint忽略它呢?
- 编辑:**
我在示例代码中遗漏了一个重要的部分。下面是更新:
....
rows, err := ...
if err != nil {
return ....
}
...
go funcThatDoesSomethingWithRows(rows)
}
...
func funcThatDoesSomethingWithRows(rows *sql.Rows) {
defer rows.Close()
所以问题是如果在启动goroutine之前出现错误,Close
将永远不会被调用,所以我必须显式地调用它,以防出现错误。
1条答案
按热度按时间fnvucqvd1#
分析您的代码,似乎这可能会导致问题。
如果我的理解是正确的,那么如果
err
不为nil,代码将返回。然后,行将不会关闭,因为它不会到达funcThatDoesSomethingWithRows