ホームページ >バックエンド開発 >Golang >Go でリフレクションを使用して Variadic Rows.Scan() を動的に呼び出す方法

Go でリフレクションを使用して Variadic Rows.Scan() を動的に呼び出す方法

DDD
DDDオリジナル
2024-12-04 00:58:13880ブラウズ

How to Dynamically Call Variadic Rows.Scan() Using Reflection in Go?

SQL スキャンのリフレクションを使用した可変個引数関数の呼び出し

SQL データベースのクエリに Rows.Scan() 関数を利用する場合、次のことが必要になります。リフレクションを使用して、受け入れるポインターの可変数を考慮します。これにより、クエリ結果からのデータをスライスに動的に取り込むことができます。

リフレクションを使用して動的にスキャンする手順

リフレクションを使用して Rows.Scan() のような可変引数関数を呼び出すには、次の手順に従います:

  1. 列を取得情報: rows.Columns() を使用して列名を取得します。
  2. スライスの作成: 2 つのスライスを作成します。1 つは値 (values) 用、もう 1 つはポインター (valuePtrs) 用です。
  3. Scan Data: それぞれのループ内結果セット内の行を検索し、各列を反復処理して valuePtrs スライスにポインターを割り当てます。次に、 rows.Scan(valuePtrs...).
  4. Retrieve Values: を呼び出します。スキャン後、データは値スライスで使用できるようになります。必要に応じて [] バイトを文字列に変換します。

コード例

次のコード スニペットは、リフレクションを使用して動的にスキャンする方法を示しています。

package main

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

func main() {
    db, _ := sql.Open("postgres", "connection_string")
    rows, _ := db.Query("SELECT * FROM my_table")

    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)
        }
    }
}

このメソッドを実装すると、データ型を指定せずにスライスにクエリ結果を動的に設定できます。進んでください。

以上がGo でリフレクションを使用して Variadic Rows.Scan() を動的に呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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