在 Go 中关闭数据库连接的更好/更短的方法

通常我写这样的东西


rows := db.MyPgConn.QueryRows(`SELECT * FROM bla`) // or any other query

for rows.Next() { // if there are result

   // rows.Scan( 

   // do custom operation

}

rows.Close() // close recordset

但是那样的话,我有可能忘记写rows.Close()这样的代码,这可能会使可用连接/套接字的数量耗尽,有没有更好的方法来做到这一点?


慕姐8265434
浏览 155回答 2
2回答

回首忆惘然

Godefer正是为此目的而引入的。rows := db.MyPgConn.QueryRows(`SELECT * FROM bla`) // or any other querydefer rows.Close()for rows.Next() { // if there are result   // rows.Scan(    // do custom operation}从文档:推迟对诸如此类的函数的调用Close有两个优点。首先,它保证您永远不会忘记关闭文件,如果您稍后编辑该函数以添加新的返回路径,则很容易犯这个错误。其次,这意味着收盘价位于开盘价附近,这比将其放在函数的末尾要清晰得多。

拉丁的传说

正如 Internet 所提到的, defer 语句是使 close 语句更接近行 var 声明位置的最佳方式。我能想到的唯一方法是在您的数据库调用周围创建一个包装函数。func performQuery(q string, op func(db.rows)) {    rows := db.MyPg.Conn.QueryRows(q)    // defer rows.Close()    op(rows)    rows.Close()}// then we could do:performQuery(`SELECT * FROM bla`,func(rows db.Rows) {  for rows.Next() {    // rows.Scan(        }})但是,这会限制您使用参数进行查询(例如SELECT * FROM tableName WHERE id = $1.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go