ホームページ >バックエンド開発 >Golang >Go でリフレクションを使用して可変個引数の `Rows.Scan()` 関数を呼び出すにはどうすればよいですか?

Go でリフレクションを使用して可変個引数の `Rows.Scan()` 関数を呼び出すにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-29 16:36:18602ブラウズ

How Can I Use Reflection to Call the Variadic `Rows.Scan()` Function in Go?

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

リフレクションを使用して Rows.Scan() 関数を呼び出すには、リフレクションの力を利用できます。可変数のポインターを関数に渡します。これは、データベース クエリ結果の値をスライスに埋め込みたい場合に特に便利です。

実装手順

  1. クエリから列名を取得します。 rows.Columns() を使用した結果。これにより、行の長さがわかります。
  2. データ ポイントを保存する []interface{} のスライスと、これらのデータ ポイントのアドレスを保存するポインタの別のスライスを作成します。
  3. ポインタのスライスでreflect.ValueOfメソッドを呼び出して、reflect.Valueオブジェクトを取得します。
  4. Addrメソッドを使用して、次のアドレスを表す値のスライスを取得します。データ ポイント。
  5. rows.Scan を呼び出し、アドレスのスライスを引数として渡します。
  6. Scan を呼び出した後、[]interface{} のスライスがデータ ポイントで埋められます。

サンプルコード

package main

import (
    "fmt"
    "reflect"
    "database/sql"
)

func main() {
    // Open a database connection.
    db, _ := sql.Open("postgres", "user=postgres dbname=database password=password")

    // Query the database.
    rows, _ := db.Query("SELECT * FROM table_name")

    // Get the column names.
    columns, _ := rows.Columns()
    columnCount := len(columns)

    // Create slices to store data points and pointers.
    data := make([]interface{}, columnCount)
    dataPtrs := make([]interface{}, columnCount)

    // Obtain a slice of pointers.
    pointers := reflect.ValueOf(dataPtrs)

    // Obtain a slice of addresses.
    addresses := pointers.Addr()

    // Fill the data points by calling Rows.Scan().
    rows.Scan(addresses...)

    // Print the data points.
    for i := 0; i < columnCount; i++ {
        fmt.Println(columns[i], data[i])
    }
}

これコード スニペットは、リフレクションを使用して、可変数のポインターで Rows.Scan() 関数を呼び出す方法を示しています。クエリ結果から列名を動的に取得し、データ ポイントとポインターを格納するスライスを作成します。リフレクションを使用してアドレスのスライスを取得すると、それを rows に渡すことができます。スキャンして、それに応じてデータ ポイントを埋めます。

以上がGo でリフレクションを使用して可変個引数の `Rows.Scan()` 関数を呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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