ホームページ  >  記事  >  バックエンド開発  >  Goで「SELECT *」列を[]文字列スライスに読み取る方法?

Goで「SELECT *」列を[]文字列スライスに読み取る方法?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-15 01:27:02844ブラウズ

How to Read

Go で "SELECT *" 列を []string に読み取る

データベースの世界では、"SELECT を使用してテーブルからデータをフェッチします" クエリは一般的な手法ですが、プログラミングの世界では、このようなデータを手動で操作するのは面倒な場合があります。この記事は、堅牢な Go 標準ライブラリを活用して、Go で「SELECT 」クエリ結果を []string スライスに読み取るプロセスを簡素化することを目的としています。

列数が不明なテーブルを扱う場合とデータ型を考慮すると、データを構造化された形式に取り込むことが課題となります。 Rows が提供する Scan メソッドを使用すると、特定のデータ型を事前定義された変数に入力できますが、[]string に直接読み取る方法は提供されません。

これを克服するために、私たちはある手法を採用しています。これにより []interface{} スライスが作成されます。各要素は []string スライス内の文字列へのポインタです。このブリッジング ステップにより、Scan メソッドでインターフェイス スライスを埋めることができ、目的の [] 文字列に簡単に変換できます。

質問で提供されているサンプル コードの改訂版は次のとおりです。

func dumpTable(rows *sql.Rows, out io.Writer) error {
    colNames, err := rows.Columns()
    if err != nil {
        return err
    }
    writer := csv.NewWriter(out)
    writer.Comma = '\t'
    readCols := make([]interface{}, len(colNames))
    writeCols := make([]string, len(colNames))
    for i, _ := range writeCols {
        readCols[i] = &writeCols[i]
    }
    for rows.Next() {
        err := rows.Scan(readCols...)
        if err != nil {
            return err
        }
        writer.Write(writeCols)
    }
    if err = rows.Err(); err != nil {
        return err
    }
    writer.Flush()
    return nil
}

このソリューションは、Scan メソッドと []string の間のギャップをシームレスに橋渡しし、「SELECT *」クエリ結果を構造化された使用可能な形式で保存できるようにします。

以上がGoで「SELECT *」列を[]文字列スライスに読み取る方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。