1 回答
TA贡献1895条经验 获得超3个赞
这是使用reflect 包的解决方案。使用指向切片的指针调用函数。
func GetAll(query string, dest interface{}) error {
// Return error if dest is not a pointer to a slice.
slice := reflect.ValueOf(dest)
if slice.Kind() != reflect.Ptr {
return errors.New("dest must be pointer")
}
slice = slice.Elem()
if slice.Kind() != reflect.Slice {
return errors.New("dest must be pointer to struct")
}
rows, err := db.Query(query)
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
// Create a new slice element. The variable elementp holds a
// pointer to the new element.
elementp := reflect.New(slice.Type().Elem())
err := rows.Scan(elementp.Interface())
if err != nil {
return err
}
// Append the element to the slice.
slice.Set(reflect.Append(slice, elementp.Elem()))
}
return nil
}
当查询结果只有一列并且 dest 是指向适合该列的类型的切片时,上面的代码适用于标准的 database/sql 包。这是一个例子:
var names []string
if err := GetAll(db, "select name from people", &names); err != nil {
// handle error
}
此代码还应与支持将多列扫描到结构的数据库包一起使用。
- 1 回答
- 0 关注
- 83 浏览
添加回答
举报