次のような構造体があります。
type inv struct {
ID int `json:"id"`
Name string `json:"name"`
}
データベースからいくつかのデータをクエリしています(エラーがないことを前提としています):
rows, err := db.Query("select id, name from inv_table")
通常、スキャンして行からデータを取得する必要があります
var i inv
for rows.Next() {
rows.Scan(&i.ID, &i.Name)
}
これはうまくいくと思います(明日テストする予定です):
var i inv
for rows.Next() {
var x []interface{} = [&i.ID, &i.Name]
rows.Scan(x... )
}
実際には、クエリの結果セットにはさらに多くの列があります。
rows.Scan(&i)
または少なくとも:
rows.Scan(getExportedValuePointers(&i)... )
私はいつでも何らかのエンコーダーを書くことができると思いますが、ボックスにはすでに何かがあるはずです。
**encode/xmlやencode/jsonに似たリフレクションコードをいつでも書くことができることを認識しています...しかし、誰かがすでにそれを行っていることを願っています。
更新:次のコードは期待どおりに機能しますが、私が望むようには機能しません:
package main
import "fmt"
type inv struct {
A int
B string
}
func main() {
var i inv
fmt.Printf("hello\n")
n, err := fmt.Sscan("1 c", &i.A, &i.B)
fmt.Printf("retval: %d %#v\n", n, err)
fmt.Printf("retval: %d, %s, %d %#v\n", i.A, i.B, n, err)
j := []interface{}{&i.A, &i.B}
k := []interface{}{i.A, i.B}
n, err = fmt.Sscan("2 d", j... )
fmt.Printf("retval: %d, %s, %d %#v\n", i.A, i.B, n, err)
fmt.Printf("retval: %d, %s\n", k... )
}