scan()variadic関数を反射
rows.scan()関数は、データベースからデータを取得するための便利な方法を提供しますクエリ。ただし、さまざまな数のポインターを引数として利用しているため、反射を使用して組み込むのが難しい場合があります。 次のシナリオを検討してください。この場合、列の数を決定し、値を保存するためのスライスを作成する必要があります。 scan()関数は、予期しない結果につながる可能性があります。これは、rows.scan()が値にポインターを期待し、単にインターフェイスのスライスを渡すだけで{}値を渡すだけでnil参照が得られるためです。 ] scan()を反射して正常に呼び出すには、デュアルスライスアプローチが採用されます。最初のスライスである値は実際のデータを保持し、2番目のスライス、ValueSptrsには値の各要素へのポインターが含まれます。値で。その後、rows.scan()は、その引数としてValueSptrsで呼び出し、効果的に値を埋めることができます。 輸入 ( 「FMT」 _ "github.com/lib/pq" 「データベース/SQL」 )) func main(){ db、_:= sql.open( 「ポストグレス」、 "user = postgres dbname = go_testing password = pass sslmode = disable")) 行、_:= db.query( "select * from _user;") 列、_:= rows.columns() count:= len(列) 値:= make([] interface {}、count) ValueSptrs:= make([] interface {}、count) rows.next(){{ i:=範囲列{ ValueSptrs [i] =&values [i] } rows.scan(valuesptrs ...) Iの場合、col:= range列{ val:= values [i] b、ok:= val。([] byte) var v interface {} if(ok){ v =文字列(b) } それ以外 { v = val } fmt.println(col、v) } } }
この例では、rows.scan()がポインタースライスValueSptrsで呼び出され、検索されたデータに値をスライスします。ループは、各列名とその対応する値を印刷します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3