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

你可能感兴趣的:(Golang,数据库,go语言)