golangci-lint抱怨SQL行没有关闭,尽管它是从goroutine关闭的

tktrz96b  于 2023-02-27  发布在  Go
关注(0)|答案(1)|浏览(153)

我使用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将永远不会被调用,所以我必须显式地调用它,以防出现错误。

fnvucqvd

fnvucqvd1#

分析您的代码,似乎这可能会导致问题。
如果我的理解是正确的,那么如果err不为nil,代码将返回。然后,行将不会关闭,因为它不会到达funcThatDoesSomethingWithRows

相关问题