猿问

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

您可以执行与在 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 rune

for i,c:=range word {

   if i>0 && c==last {

      fmt.Println(string(c))

   }

   last=c

   }

}

字符串上的范围将迭代字符串的符文,而不是字节。因此,即使字符串包含多字节字符,此版本也是正确的。



收到一只叮咚
浏览 106回答 1
1回答

芜湖不芜

您编写的代码存在一些问题。避免连接泄漏问题的直接答案是关闭迭代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)    }
随时随地看视频慕课网APP

相关分类

Go
我要回答