我写了一个Golang代码示例,该代码将查询发送到postgres并将结果发送到寻呼机:
package main
import (
"fmt"
"database/sql"
_ "github.com/lib/pq"
"log"
"os/exec"
"strings"
"os"
)
func main() {
connstr := "user=postgres dbname=postgres sslmode=disable"
db, err := sql.Open("postgres", connstr)
if err != nil { log.Fatal(err) }
rows, err := db.Query("SELECT schemaname, relname, seq_scan FROM pg_stat_all_tables ORDER BY 1 LIMIT 10")
if err != nil { log.Fatal(err) }
defer rows.Close()
var buf string
for rows.Next() {
var s, r string
var ss int
if err := rows.Scan(&s, &r, &ss); err != nil { log.Fatal(err) }
buf = fmt.Sprintf("%s %s %d\n", buf + s, r, ss)
}
cmd := exec.Command("less")
cmd.Stdin = strings.NewReader(buf)
cmd.Stdout = os.Stdout
err = cmd.Run()
if err != nil { log.Fatal(err) }
}
但是下面这行:
buf = fmt.Sprintf("%s %s %d\n", buf + s, r, ss)
对我来说看起来很粗鲁,我不确定这是正确的方法。有没有办法以更优雅的方式达到效果?某些缓冲区和io.Readers是否可能?
Go中的字符串是不可变的,每次将新值分配给变量时,它都必须创建一个新字符串并将现有内容复制到该字符串中。
您可以使用bytes.Buffer
而不是string
避免在每次迭代中重新创建。
package main
import (
"fmt"
"database/sql"
_ "github.com/lib/pq"
"log"
"os/exec"
"strings"
"os"
"bytes"
)
func main() {
connstr := "user=postgres dbname=postgres sslmode=disable"
db, err := sql.Open("postgres", connstr)
if err != nil { log.Fatal(err) }
rows, err := db.Query("SELECT schemaname, relname, seq_scan FROM pg_stat_all_tables ORDER BY 1 LIMIT 10")
if err != nil { log.Fatal(err) }
defer rows.Close()
var buf = new(bytes.Buffer)
for rows.Next() {
var s, r string
var ss int
if err := rows.Scan(&s, &r, &ss); err != nil { log.Fatal(err) }
buf.WriteString(fmt.Sprintf("%s %s %d\n", s, r, ss))
}
cmd := exec.Command("less")
cmd.Stdin = buf
cmd.Stdout = os.Stdout
err = cmd.Run()
if err != nil { log.Fatal(err) }
}
顺便说一句,在Go 1.10 https://godoc.org/strings#Builder中添加了字符串生成器
阅读有关字符串连接基准的更多信息:http : //herman.asia/efficiency-string-concatenation-in-go
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句