よりエレガントな方法はありますか?

レソフスキー:

クエリをpostgresに送信して結果をページャーに送信するGolangコードの例を書きました:

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/efficient-string-concatenation-in-goをご覧ください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この「if」リストをよりエレガントな方法で書く方法はありますか?

分類Dev

ニュートンの方法のよりエレガントなGo実装はありますか?

分類Dev

Javaでリストを処理するよりエレガントな方法はありますか?(Python VS Java)

分類Dev

Rでのネストされた操作。よりエレガントな方法はありますか?

分類Dev

freemarkerで変数をチェックするよりエレガントな方法はありますか?

分類Dev

部分文字列を作成するためのよりエレガントな方法はありますか?

分類Dev

これらの条件を書くためのよりエレガントな方法はありますか?

分類Dev

UIImageの複数の属性に対してよりエレガントな方法はありますか?

分類Dev

このタイプの順列のためのよりエレガントな方法はありますか?

分類Dev

UIImageの複数の属性に対してよりエレガントな方法はありますか?

分類Dev

これを書くためのより短く/エレガント/効率的な方法はありますか?

分類Dev

CUDAでmallocおよびfreeするためのより良い/よりクリーンな/よりエレガントな方法はありますか?

分類Dev

関係を定義するエレガントな方法はありますか?

分類Dev

イベント/トリガーを定期的にチェックするためのよりエレガントな方法はありますか?

分類Dev

エコー* | xargs -n1 echo、行ごとのリストのより短く、よりエレガントな方法はありますか?

分類Dev

Pythonで辞書ループ例外を処理するためのより良いまたはよりエレガントな方法はありますか?

分類Dev

このコードよりもJavaでXMLドキュメントを文字列に変換するよりエレガントな方法はありますか?

分類Dev

角度のあるよりエレガントな非表示/表示パターンはありますか?

分類Dev

`#pragma warning disable`の使用法をよりエレガントにする方法はありますか?

分類Dev

複数のORおよびANDで多対多のテーブルをクエリするよりエレガントな方法はありますか?

分類Dev

独立したif()でelseステートメントを使用するよりエレガントな方法はありますか

分類Dev

これらのブール式のよりエレガントな構文はありますか?

分類Dev

((x == a and y == b)または(x == b and y == a))を表現するよりエレガントな方法はありますか?

分類Dev

stream.reduceの後に主人公を切り刻むよりエレガントな方法はありますか?

分類Dev

Option <Cookie>をデフォルトの文字列でアンラップするよりエレガントな方法はありますか?

分類Dev

配列サイズがわからないRubyでwhileループを書くよりエレガントな方法はありますか?

分類Dev

ネストされた配列フィルタリング、よりエレガントな方法はありますか?

分類Dev

これを書くためのよりコンパクトでエレガントな方法はありますか?

分類Dev

switch-caseの関数からデータを変更するより効率的でエレガントな方法はありますか?

Related 関連記事

  1. 1

    この「if」リストをよりエレガントな方法で書く方法はありますか?

  2. 2

    ニュートンの方法のよりエレガントなGo実装はありますか?

  3. 3

    Javaでリストを処理するよりエレガントな方法はありますか?(Python VS Java)

  4. 4

    Rでのネストされた操作。よりエレガントな方法はありますか?

  5. 5

    freemarkerで変数をチェックするよりエレガントな方法はありますか?

  6. 6

    部分文字列を作成するためのよりエレガントな方法はありますか?

  7. 7

    これらの条件を書くためのよりエレガントな方法はありますか?

  8. 8

    UIImageの複数の属性に対してよりエレガントな方法はありますか?

  9. 9

    このタイプの順列のためのよりエレガントな方法はありますか?

  10. 10

    UIImageの複数の属性に対してよりエレガントな方法はありますか?

  11. 11

    これを書くためのより短く/エレガント/効率的な方法はありますか?

  12. 12

    CUDAでmallocおよびfreeするためのより良い/よりクリーンな/よりエレガントな方法はありますか?

  13. 13

    関係を定義するエレガントな方法はありますか?

  14. 14

    イベント/トリガーを定期的にチェックするためのよりエレガントな方法はありますか?

  15. 15

    エコー* | xargs -n1 echo、行ごとのリストのより短く、よりエレガントな方法はありますか?

  16. 16

    Pythonで辞書ループ例外を処理するためのより良いまたはよりエレガントな方法はありますか?

  17. 17

    このコードよりもJavaでXMLドキュメントを文字列に変換するよりエレガントな方法はありますか?

  18. 18

    角度のあるよりエレガントな非表示/表示パターンはありますか?

  19. 19

    `#pragma warning disable`の使用法をよりエレガントにする方法はありますか?

  20. 20

    複数のORおよびANDで多対多のテーブルをクエリするよりエレガントな方法はありますか?

  21. 21

    独立したif()でelseステートメントを使用するよりエレガントな方法はありますか

  22. 22

    これらのブール式のよりエレガントな構文はありますか?

  23. 23

    ((x == a and y == b)または(x == b and y == a))を表現するよりエレガントな方法はありますか?

  24. 24

    stream.reduceの後に主人公を切り刻むよりエレガントな方法はありますか?

  25. 25

    Option <Cookie>をデフォルトの文字列でアンラップするよりエレガントな方法はありますか?

  26. 26

    配列サイズがわからないRubyでwhileループを書くよりエレガントな方法はありますか?

  27. 27

    ネストされた配列フィルタリング、よりエレガントな方法はありますか?

  28. 28

    これを書くためのよりコンパクトでエレガントな方法はありますか?

  29. 29

    switch-caseの関数からデータを変更するより効率的でエレガントな方法はありますか?

ホットタグ

アーカイブ