如何将结构指针转换为go中的类型指针列表

时间:2012-12-11 02:12:38

标签: reflection go

我有一个看起来像这样的结构:

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

2 个答案:

答案 0 :(得分:2)

如果您正在寻找一个能够自动将SQL查询绑定到“inv”结构的包,那么请看一下gorp:

https://github.com/coopernurse/gorp

答案 1 :(得分:0)

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