sqlx包中的StructScan, SliceScan, MapScan三种扫描方式

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()
}

猜你喜欢

转载自blog.csdn.net/weixin_45765795/article/details/113033463