2015-06-15 52 views
0

我需要为接口(指向结构体)使用StructScan函数。 但是,如果我尝试反映价值,我有错误,因为反映。新()返回reflect.Value类型。我如何扫描结构和存储数据到dest var?使用sqlx.Rows.StructScan作为接口参数

// 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 

     } 
    } 
} 
+0

你的结构标记应该具有反引号,不是单引号。像https://github.com/jmoiron/sqlx这样的软件包也可以帮助将行编组到结构中。 – elithrar

回答

0

解决

// 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())) 
     } 
    } 
}