go mysql实现数据库查询结果映射到结构体相应字段中

上一节实现了对数据库查询结果的一个简单操作,将数据保存在map中,以方便进行后续的操作。这一节将继续介绍如何将数据库查询到的结果映射到结构体字段中,映射时主要通过结构体中的tag标签来实现匹配映射。这个操作需要用到go中的reflect包来实现。主要思路是:
循环取出映射中的数据,然后比较取出的数据与结构体成员变量的类型是否一致,如果一致直接映射,不一致则先进行类型转换再通过FieldByName().Set()进行映射.下边介绍整个过程中需要注意的点:
go mysql实现数据库查询结果映射到结构体相应字段中
这个函数的第一个参数是要进行映射的数据,第二个参数是一个空的结构体,用来放映射进来的数据。可能大家已经发现了,第一个参数是我们上一篇文章中提到的数据库表中的一行记录,所以如果是多行查询结果需要将该函数放到循环中来使用。
1.reflect.Typeof()reflect.ValueOf()是reflect包中两个重要的方法,分别返回变量的动态类型和值。如果其参数是指针类型那么需要在后边加上.Elem()来获取变量的动态类型或值。
2.向一个空结构体中映射数据其实相当于对结构体进行初始化,给每个结构体成员赋值,我们通过循环来实现。因为从结构体中取出的数据,其字段名可能和结构体成员变量名稍有不同,我们通过结构体中的tag标签来准确取出从数据库表中查询结果的字段对应值。比如下方代码中:
go mysql实现数据库查询结果映射到结构体相应字段中
通过for循环依次利用a:=ptype.Field(i).Tag.Get("sql")取到结构体中sql对应的映射值ID,ProductName,ProductNum等,再利用data[a]准确的取出对应的数据,.field(i).Tag()来获取数据主要是为了防止映射中字段顺序和结构体中不一致带来的错误,因为映射中的数据顺序并不一定和插入顺序一致。
利用ptype.Field(i).Name()取出要映射到的结构体成员变量。比较结构体成员变量的类型和要映射进来的数据类型是否一致,如果不一致需要进行转换,然后利用pvalue.FieldByName(结构体成员变量名).Set(值)来实现最终的映射。
下边放上部分的类型转换,因为.set()的值需要是reflect包的rvalue类型,所以通过reflect.ValueOf(值)来返回结果。函数的第一个参数是要进行类型转换的值,第二个参数是要转换成的类型。
go mysql实现数据库查询结果映射到结构体相应字段中