我需要在循环中对数据库进行SQL查询:
for rows.Next() { fields, err := db.Query(.....) if err != nil { // ... } defer fields.Close() // do something with `fields` }
更好的方法是:保持原样或defer循环后移动:
defer
for rows.Next() { fields, err := db.Query(.....) if err != nil { // ... } // do something with `fields` } defer fields.Close()
或者是其他东西 ?
整个要点defer是直到函数返回才执行,因此将其放置在要关闭的资源打开后的适当位置。但是,由于要在循环内创建资源,因此根本不要使用defer- 否则,在函数退出之前,您不会关闭在循环内创建的任何资源,因此它们会堆积直到然后。相反,您应该在每次循环迭代结束时关闭它们, 而无需 defer:
for rows.Next() { fields, err := db.Query(.....) if err != nil { // ... } // do something with `fields` fields.Close() }