データベースの結果を操作する場合、リフレクションを使用して Rows.Scan() 関数を呼び出すことが必要になる場合があります。ただし、関数には可変数のポインターが必要であるため、これは困難になる可能性があります。この記事では、このニーズに対処する実用的なソリューションについて詳しく説明します。
リフレクションを利用することで、データベース クエリから取得した値をスライスに設定することを目指します。このプロセスには、列の数を決定し、データ ポイントを保持するために空のインターフェイスのスライスを割り当てることが含まれます。このアプローチにより、値の型を事前に知らなくても値を柔軟に処理できます。
サンプル コードと実装
次のコードは、このアプローチの実装例を示しています。
package main import ( "database/sql" "fmt" _ "github.com/lib/pq" ) 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) } } }
鍵Success
このアプローチの鍵は、2 つのスライスを使用することにあります。1 つは値を格納し、もう 1 つは各値に対応するポインターを含みます。ポインタが使用された後、値スライスにデータが設定され、さらなる処理のために実際のデータ ポイントへのアクセスが提供されます。
リフレクションを活用することで、コードに次の型の値を処理できる機能が与えられます。事前にはわかりません。この柔軟性により、データベース インタラクションの多用途性と再利用性が向上します。
以上がリフレクションを使用して可変個引数の `Rows.Scan()` 関数を呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。