使用sqlx.Rows.StructScan来处理接口参数。

huangapple go评论76阅读模式
英文:

Using sqlx.Rows.StructScan for interface args

问题

我需要为接口(指向结构体的指针)使用StructScan函数。但是,如果我尝试反射值,我会得到错误,因为reflect.New()返回的是reflect.Value类型。我该如何扫描结构体并将数据存储到dest变量中?

// 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) // 在这里失败

        }
    }
}
英文:

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?

<!-- language: lang-go -->

// package 1
type Data struct {
	id int `db:&quot;id&quot;`
	caption string `db:&quot;caption&quot;`
}

func Func1 {
	data := []Data{}
	GetData(&amp;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(&amp;myData) // Fail here

		}
	}
}

答案1

得分: 1

已翻译的内容:

已解决

// 包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()))
        }
    }
}
英文:

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

huangapple
  • 本文由 发表于 2015年6月16日 05:45:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/30855499.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定