为了账号安全,请及时绑定邮箱和手机立即绑定

lib/pq postgres 驱动程序中的连接泄漏

lib/pq postgres 驱动程序中的连接泄漏

Go
收到一只叮咚 2023-08-14 16:28:11
您可以执行与在 Python 中相同的操作:word := "helloujjkk"for i:=0;i<len(word)-1;i++ {    if word[i]==word[i+1] {       fmt.Println(string(word[i]))    }}但是,如果您的单词包含多字节字符,这将会中断。Go 中的字符串索引将字符串视为字节数组,word[i]字符串的第 i 个字节也是如此。这不一定是第 i 个字符。更好的解决方案是保留从字符串中读取的最后一个字符:var last runefor i,c:=range word {   if i>0 && c==last {      fmt.Println(string(c))   }   last=c   }}字符串上的范围将迭代字符串的符文,而不是字节。因此,即使字符串包含多字节字符,此版本也是正确的。
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

您编写的代码存在一些问题。避免连接泄漏问题的直接答案是关闭迭代rows器,如文档中所述。调用它的正常方法是在defer声明中:

    rows, err := db.Query(

        "select 1 from things where id = $1",

        thing,

    )

    if err != nil {

        return nil, fmt.Errorf("can't select thing (%d): %w", thing, err)

    }

    defer rows.Close()


    found := false


    for rows.Next() {

        found = true

        break

    }

其次,由于您关心的只是单个结果,因此根本没有理由获取多行结果集,这也将隐式解决连接泄漏问题。如果我们在这里进行调整:


 row, err := db.QueryRow(

        "select EXISTS(SELECT 1 from things where id = $1)",

        thing,

    )

    if err != nil {

        return nil, fmt.Errorf("can't select thing (%d): %w", thing, err)

    }

    var found bool

    if err := row.Scan(&found); err != nil {

        return nil, fmt.Errorf("Failed to scan result: %w", err)

    }


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信