go
resource_error
ai_generated
true
sql: 行已关闭
sql: Rows are closed
ID: go/database-sql-rows-close-error
78%修复率
82%置信度
1证据数
2023-11-20首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| go1.21 | active | — | — | — |
| go1.22 | active | — | — | — |
根因分析
在 *sql.Rows 对象被显式关闭或所有行已耗尽但未正确迭代后,调用 Scan 或 Next。
English
Calling Scan or Next on a *sql.Rows object after it has been explicitly closed or after all rows have been exhausted without proper iteration.
官方文档
https://pkg.go.dev/database/sql#Rows解决方案
-
确保 rows.Next() 循环完整执行后再访问行:for rows.Next() { ... }; if err := rows.Err(); err != nil { ... } -
避免在迭代完成前调用 rows.Close();让 defer 在循环后处理。
无效尝试
常见但无效的做法:
-
Adding defer rows.Close() after checking error but before iterating
70% 失败
Deferring close doesn't prevent premature closure; the error occurs after rows are exhausted, not from missing close.
-
Calling rows.Close() multiple times
45% 失败
Closing an already closed rows object is safe in Go, but doesn't fix the premature access; the root cause is logic error.