douju6850 2015-06-15 21:45
浏览 57
已采纳

将sqlx.Rows.StructScan用于接口args

I need to use StructScan function for interface (pointer to struct). But if I try to reflect value, I've got error, because reflect.New() returning reflect.Value type. How I can scan structure and store data into 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条回答 默认 最新

  • dqsvnsad79721 2015-06-16 15:56
    关注

    Solved

    // 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()))
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?