Go语言中如何将数据库查询结果转换为自定义分组结构体?

go语言数据库查询结果转换为自定义分组结构体详解

本文将详细讲解如何将MySQL数据库查询结果转换为Go语言中预定义的自定义分组结构体。核心在于高效处理数据分组和结构转换。

假设MySQL数据库查询结果如下:

{id:1,username:'xx',age:xx,frist_name:"a"},{id:2,username:'xx',age:xx,frist_name:"b"},{id:3,username:'xx',age:xx,frist_name:"a"},

目标是将其转换为以下Go结构体:

type myLists struct {    FristName string   `json:"frist_name"`    Lists     []userLists `json:"lists"`}type userLists struct {    Id       string `json:"id"`    Username string `json:"username"`    Age      string `json:"age"`}

期望的JSON输出格式:

立即学习“go语言免费学习笔记(深入)”;

[  {    "frist_name": "a",    "lists": [      {        "id": "1",        "username": "xxx",        "age": "xxx"      },      {        "id": "3",        "username": "xxx",        "age": "xxx"      }    ]  },  {    "frist_name": "b",    "lists": [      {        "id": "2",        "username": "xxx",        "age": "xxx"      }    ]  }]

实现步骤:

定义中间结构体: 方便解析JSON数据。

type r struct {    Id        uint64 `json:"id"`    Username  string `json:"username"`    Age       string `json:"age"`    FristName string `json:"frist_name"`}

编写数据转换函数:

package mainimport (    "encoding/json"    "fmt")// ... (myLists and userLists definitions as above) ...func transformData(data []r) ([]myLists, error) {    result := make(map[string]myLists)    for _, item := range data {        key := item.FristName        if _, ok := result[key]; !ok {            result[key] = myLists{FristName: key}        }        result[key].Lists = append(result[key].Lists, userLists{Id: fmt.Sprint(item.Id), Username: item.Username, Age: item.Age})    }    var finalResult []myLists    for _, v := range result {        finalResult = append(finalResult, v)    }    return finalResult, nil}func main() {    rss := []string{        `{"id":1,"username":"xx","age":"xx","frist_name":"a"}`,        `{"id":2,"username":"xx","age":"xx","frist_name":"b"}`,        `{"id":3,"username":"xx","age":"xx","frist_name":"a"}`,    }    var data []r    for _, rs := range rss {        var t r        err := json.Unmarshal([]byte(rs), &t)        if err != nil {            fmt.Println("Unmarshal error:", err)            return        }        data = append(data, t)    }    transformedData, err := transformData(data)    if err != nil {        fmt.Println("Transform error:", err)        return    }    jsonData, err := json.MarshalIndent(transformedData, "", "  ")    if err != nil {        fmt.Println("Marshal error:", err)        return    }    fmt.Println(string(jsonData))}

这段代码首先使用map进行分组,避免了原代码中冗余的循环查找。 transformData 函数将中间结构体 r 的 slice 转换为 myLists 的 slice。main 函数模拟数据库查询结果,并调用 transformData 函数进行转换,最后将结果转换为 JSON 格式输出。 请将 rss 替换为实际的数据库查询代码。 记住处理潜在的错误,例如数据库连接错误和JSON解析错误。 fmt.Sprint(item.Id)uint64 类型的 ID 转换为字符串,与目标 JSON 结构匹配。

Go语言中如何将数据库查询结果转换为自定义分组结构体?

以上就是Go语言中如何将数据库查询结果转换为自定义分组结构体?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1385009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 04:45:02
下一篇 2025年12月15日 04:45:11

相关推荐

发表回复

登录后才能评论
关注微信