使用go 1.23
golang database/sql查询数据,使用泛型将多个字段值设置到struct数组中,无需一个个字段名进行设置(例如:rows.Scan(&b.Name, &b.Age,&b.Moddate))
func findListFromRows[T any](rs *sql.Rows) ([]T, error) {
// var results []User
var results []T
for rs.Next() {
// var result User
var result T
// 使用反射获取结构体的类型和值
resultType := reflect.TypeOf(result)
resultValue := reflect.ValueOf(&result).Elem() // 获取指针的值
log.Println("resultType:", resultType)
log.Printf("resultValue:%+v\n", resultValue)
columns, _ := rs.Columns()
log.Println("columns:", columns)
scanArgs := make([]interface{}, len(columns))
// 遍历结构体的每个字段
for i := range columns {
field := resultType.Field(i)
log.Printf("field:%+v\n", field)
// 获取字段的值
fieldValue := resultValue.Field(i)
//log.Println("fieldValue:", fieldValue)
v := fieldValue.Addr().Interface() // 获取字段指针的值
scanArgs[i] = v
}
//log.Println("scanArgs addr---:", scanArgs)
err := rs.Scan(scanArgs...)
if err != nil {
log.Println("扫描失败:", err)
return nil, err
}
results = append(results, result)
}
if err := rs.Err(); err != nil {
return nil, err
}
log.Printf("results:%+v\n", results)
return results, nil
}