2

次のような構造体があります。

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... )
}
4

2 に答える 2

2

SQL クエリを "inv" 構造体に自動的にバインドするパッケージを探している場合は、gorp をご覧ください。

https://github.com/coopernurse/gorp

于 2012-12-13T03:57:05.353 に答える
0

これを自動的に行うものは何もありませんが、reflect パッケージを使用してそれを行う関数を作成できます。

于 2012-12-11T02:25:19.553 に答える