golang database/sql查询数据,将多个字段值设置到struct数组中

使用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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值