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 サイトの他の関連記事を参照してください。