使用sqlx.Rows.StructScan进行接口args

时间:2015-06-15 21:45:45

标签: go sqlx

我需要使用StructScan函数作为接口(指向struct的指针)。 但是如果我试图反映价值,我就会收到错误,因为 reflect.New()返回 reflect.Value 类型。我如何扫描结构并将数据存储到 dest var?

// package 1
type Data struct {
    id int `db:"id"`
    caption string `db:"caption"`
}

func Func1 {
    data := []Data{}
    GetData(&data)
    log.Println(data)
}

// package 2
func GetData(sql string, dest interface{}) {
    rows, err := DBI.Queryx(sql)
    if err == nil {
        // reflect.Value
        myData := reflect.New(reflect.TypeOf(dest).Elem().Elem())
        for rows.Next() {
            rows.StructScan(&myData) // Fail here

        }
    }
}

1 个答案:

答案 0 :(得分:1)

解决了

// package 2
func GetData(sql string, dest interface{}) {
    arr := reflect.ValueOf(dest).Elem()
    v := reflect.New(reflect.TypeOf(dest).Elem().Elem())
    rows, err := DBI.Queryx(sql)
    if err == nil {
        if err = rows.StructScan(v.Interface()); err == nil {
            arr.Set(reflect.Append(arr, v.Elem()))
        }
    }
}