Scan
如果想要看Scan的话我这里已经写过了 https://blog.csdn.net/weixin_45765795/article/details/112766580就不在详讲了
第一种 StructScan
通俗的来讲就是放到结构体Struct中的数据的一种扫描方式,在查询你知道具体有多少个数据,只需要将同等数据映射过来的话就用结构体扫描,这个StructScan将扫描整行
StructScan将会扫描整个行结果,如果你不想为整个结果分配结构,使用Queryx并查看sqlx.Rows.StructScan。如果行是sqlx,它将使用它的映射器,否则它将使用默认值。
func StructScan(rows rowsi, dest interface{
}) error {
return scanAll(rows, dest, true)
}
第二种 SliceScan
这种很不错,在你不知道能传过来多少个数据和对于未知多少列的情况下使用
扫描一行,返回一个[]interface{},其值类似于MapScan。这个函数主要用于未知列数。因为你可以直接将[]interface{}传递给Scan,你这样做的话,它就不需要分配给每一行的Slice。
func SliceScan(r ColScanner) ([]interface{
}, error) {
// 忽略r.started,我们不需要在任何情况下使用reflect。
columns, err := r.Columns()
if err != nil {
return []interface{
}{
}, err
}
values := make([]interface{
}, len(columns))
for i := range values {
values[i] = new(interface{
})
}
err = r.Scan(values...)
if err != nil {
return values, err
}
for i := range columns {
values[i] = *(values[i].(*interface{
}))
}
return values, r.Err()
}
第三种 MapScan
需要扫描到一个Map里面,使用这个函数来获取可能不在你控制范围内的SQL结果
例如:如果你正在为一个SQL server构建一个接口从输入执行SQL)。
请不要将此作为主界面! 这将修改发送给它的映射,因此重用相同的结果映射出现多次的列将被覆盖对方!
func MapScan(r ColScanner, dest map[string]interface{
}) error {
// ignore r.started, since we needn't use reflect for anything.
columns, err := r.Columns()
if err != nil {
return err
}
values := make([]interface{
}, len(columns))
for i := range values {
values[i] = new(interface{
})
}
err = r.Scan(values...)
if err != nil {
return err
}
for i, column := range columns {
dest[column] = *(values[i].(*interface{
}))
}
return r.Err()
}