Golang中无需Scan直接从Rows循环获取JSON格式数据
可以直接获取每行的JSON格式数据
当然可以实现,不需要手动为每个字段声明变量并调用rows.Scan(),我们可以利用结果集的列元数据动态处理每行数据,最终转换为JSON格式。核心思路是先获取列名,再动态扫描每行字段值,最后映射为键值对并序列化为JSON。
实现代码示例
import "encoding/json" tsql := "SELECT * from Users;" // Execute query rows, err := db.QueryContext(ctx, tsql) if err != nil { return -1, err } defer rows.Close() // 获取结果集的列名 columns, err := rows.Columns() if err != nil { return -1, err } // 准备存储每行字段值的切片,类型为interface{} values := make([]interface{}, len(columns)) // 为每个元素创建指针,用于rows.Scan valuePtrs := make([]interface{}, len(columns)) for i := range values { valuePtrs[i] = &values[i] } // 遍历结果集 for rows.Next() { // 扫描当前行到指针切片 if err := rows.Scan(valuePtrs...); err != nil { return -1, err } // 构建列名到值的映射 rowMap := make(map[string]interface{}) for i, col := range columns { val := values[i] // 处理部分驱动返回的[]byte类型,转换为字符串 if b, ok := val.([]byte); ok { rowMap[col] = string(b) } else { rowMap[col] = val } } // 转换为JSON jsonData, err := json.Marshal(rowMap) if err != nil { return -1, err } // 输出JSON字符串,或进行后续业务处理 fmt.Println(string(jsonData)) } // 检查遍历过程中的错误 if err := rows.Err(); err != nil { return -1, err }
说明
- 这里底层仍会用到
rows.Scan(),但不需要手动为每个字段声明变量,而是通过动态创建的指针切片完成扫描,适配任意查询结果结构。 - 通过
rows.Columns()获取列名后,将每行数据映射为map[string]interface{},再用json.Marshal()序列化为JSON格式。 - 代码中加入了对
[]byte类型的处理(部分数据库驱动会返回字节数组),确保字符串类型能正确转换。
内容的提问来源于stack exchange,提问作者Sravan JS
相关产品推荐
相关产品推荐

