如何动态的设置结构体字段值

我想将sql取出的值放入一个结构体中,但现在只能一个字段一个字段的放,我不知道怎么动态的去设置结构体字段,比如下面从sql中取值的例子

type TemplateInfo struct {
        id                         int
        AAA                 sql.NullString
        BBB          sql.NullString
        CCC   sql.NullString
    }
    var template_info TemplateInfo
    sql := `SELECT id,AA,BB,CC FROM myTable where id = $1 `
    my_id := 1
// scan后面的结构体字段要全写上
err:=DB.QueryRow(sql,my_id).Scan(&template_info.id,&template_info.AAA,&template_info.BBB,&template_info.CCC)

// 但如果有几十个字段,也这样写就不太好了 ,是否有简洁的写法,可以将字段值放入结构体中?

//———————我是分隔线——————————
参考了大家给的方法,最终完成,代码如下

type TemplateInfo struct {
        Id    int //字段要大写开头,否则外部不能访问
        AAA   sql.NullString
        BBB   sql.NullString
        CCC   sql.NullString
    }
    var template_info TemplateInfo
    sql := `SELECT Id,AA,BB,CC FROM myTable where Id = $1 `
    my_id := 1
    rows, err := DB.Query(sql, my_id)

    if err != nil {
        fmt.Println("Get sql failed")
    } else {
        columns, _ := rows.Columns()
        values := make([]interface{}, len(columns))
        reflectStruct := reflect.ValueOf(&template_info).Elem()

        for i, v := range columns {
            if reflectStruct.FieldByName(v).Addr().CanInterface() {
                values[i] = reflectStruct.FieldByName(v).Addr().Interface()
            } else {
                fmt.Printf("column %s convert failed", v)
                os.Exit(1)
            }
        }

        for rows.Next() {
            rows.Scan(values...)
        }
讨论数量: 3

可以看下gorm是怎么绑定的。大多是做json类似的绑定

1年前 评论
var result []Result
db.Raw(sql, parm).Scan(&result)
1年前 评论

使用绑定吧,建个结构体打上标签,Scan进去就行。空数据对应的是数据类型的零值。看看gorm文档有例子的 gorm.io/zh_CN/docs/query.html#Stru...

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!