如何动态的设置结构体字段值
我想将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...)
}
推荐文章: