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

文章目录

    • Scan

    • 第一种 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()}
(0)

相关推荐