ホームページ > バックエンド開発 > Golang > Go Reflection を効率的に使用して、動的な数のポインターを使用して「Scan」可変引数関数を呼び出すにはどうすればよいですか?

Go Reflection を効率的に使用して、動的な数のポインターを使用して「Scan」可変引数関数を呼び出すにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-10 00:21:14
オリジナル
852 人が閲覧しました

How Can I Efficiently Use Go Reflection to Call the `Scan` Variadic Function with a Dynamic Number of Pointers?

Go でリフレクションを使用した Scan Variadic 関数の呼び出し

データベース/SQL パッケージの Row インターフェイスの Scan() メソッドを使用すると、正しい型の値へのポインターの可変引数リストを渡すことによって、データベース行から値を取得します。便利ではありますが、リフレクションを使用して可変数のポインターから値を取得するこのメソッドの操作は困難な場合があります。

ソリューション

提供されているソリューションは、動的に2 つのスライス: 1 つは値の保存用、もう 1 つは並列ポインターの保持用です。ポインタを使用して値スライス内のデータを収集すると、他のデータ構造を取り込むことができます。

コード

package main

import (
    "fmt"
    _ "github.com/lib/pq"
    "database/sql"
)

func main() {
    db, _ := sql.Open(
        "postgres",
        "user=postgres dbname=go_testing password=pass sslmode=disable")

    rows, _ := db.Query("SELECT * FROM _user;")

    columns, _ := rows.Columns()
    count := len(columns)
    values := make([]interface{}, count)
    valuePtrs := make([]interface{}, count)

    for rows.Next() {
        for i := range columns {
            valuePtrs[i] = &values[i]
        }

        rows.Scan(valuePtrs...)

        for i, col := range columns {
            val := values[i]

            b, ok := val.([]byte)
            var v interface{}
            if (ok) {
                v = string(b)
            } else {
                v = val
            }

            fmt.Println(col, v)
        }
    }
}
ログイン後にコピー

コードは、まずデータベースへの接続を開き、実行します。クエリ。次に、結果セット内の列の数を決定し、列と同じ長さの 2 つのスライス、values と valuePtrs を作成します。

行のループ内で、valuePtrs スライスには次のアドレスが設定されます。値スライスの各要素。次に、valuePtrs スライスを使用して rows.Scan() メソッドが呼び出され、現在の行のデータが値スライスに効果的に設定されます。

最後に、コードは列名と値を反復処理して、バイト スライスを次のように変換します。必要に応じて文字列を入力し、結果を出力します。

以上がGo Reflection を効率的に使用して、動的な数のポインターを使用して「Scan」可変引数関数を呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート