有没有更优雅的方式?

列索夫斯基:

我写了一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有更优雅的方式来写这些条件?

有没有更优雅的方式来重复使用代码块?

有没有更优雅的方式在 SwiftUI 中使用颜色文字?

有没有更优雅的方式在Kotlin中编写此吸气剂?

有没有更优雅的方式来启动基于列表的线程?

Ramda 拒绝 - 有没有更优雅的方式来写这个?

有没有更优雅的方式来执行这个 switch 语句?

有没有更好/更干净/更优雅的方式来分配和释放cuda?

有没有更优雅的方式来编码此生成器?

有没有更优雅的方式来声明新的 var 并同时使用 global

有没有更优雅的方式来使用 AutoIt 获取 Internet Expolor 版本

有没有更优雅的方式来读取CSV列并与记录ID合并?

有没有一种更优雅的方式来代替编写大量查询?

有没有更优雅的方式在C#中嵌套数组?

有没有更优雅的方式来编写这个 If/or 条件?

有没有更优雅的方式在 R 中使用映射值?

有没有更优雅的子串方法?

有没有更短、更优雅的写法?

有没有更优雅的方式编写函数,该函数根据函数的参数返回图像的名称?

有没有更优雅的表达方式((x == a和y == b)或(x == b和y == a))?

有没有一种更优雅的方式在Ruby中编写不知道数组大小的while循环?

有没有更优雅的方式来将else语句与独立的if()s一起使用

有没有更优雅的方法来折叠 dplyr 中的两行?

有没有更优雅的方法来过滤函数的失败结果?

有没有更优雅的方法来检查表单默认值?

有没有一种方法可以更优雅地编写此“ if”列表?

有没有更优雅的方法可以在Swift中编写这种惰性加载模式?

有没有更优雅的方法来查询多个OR和AND上的多对多表?

有没有更优雅的方法来检查freemarker中的变量?