# sql: 行已关闭

- **ID:** `go/database-sql-rows-close-error`
- **领域:** go
- **类别:** resource_error
- **验证级别:** ai_generated
- **修复率:** 78%

## 根因

在 *sql.Rows 对象被显式关闭或所有行已耗尽但未正确迭代后，调用 Scan 或 Next。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| go1.21 | active | — | — |
| go1.22 | active | — | — |

## 解决方案

1. ```
   确保 rows.Next() 循环完整执行后再访问行：for rows.Next() { ... }; if err := rows.Err(); err != nil { ... }
   ```
2. ```
   避免在迭代完成前调用 rows.Close()；让 defer 在循环后处理。
   ```

## 无效尝试

- **Adding defer rows.Close() after checking error but before iterating** — Deferring close doesn't prevent premature closure; the error occurs after rows are exhausted, not from missing close. (70% 失败率)
- **Calling rows.Close() multiple times** — Closing an already closed rows object is safe in Go, but doesn't fix the premature access; the root cause is logic error. (45% 失败率)
