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

没有什么可以自动执行此操作,但您可以使用反射包编写一个函数来执行此操作。

于 2012-12-11T02:25:19.553 回答