You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:35:21