Go语言MySQL查询结果转换为自定义结构体切片详解
本文介绍如何将Go语言中从MySQL数据库查询得到的列表数据转换为自定义结构体切片。假设数据库查询返回的数据类似于{id:1, username:'xx', age:xx, frist_name:"a"}
,目标是将其转换为特定JSON格式,包含frist_name
字段和一个包含用户信息的结构体切片lists
。
为此,我们需要定义两个结构体:UserLists
和myLists
。UserLists
存储用户信息(id, username, age),myLists
包含frist_name
和UserLists
结构体切片lists
。最终目标是将数据库查询结果转换为myLists
结构体切片。
以下代码演示转换过程:
package main import ( "encoding/json" "fmt" ) 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"}`, } type r struct { Id uint64 `json:"id"` Username string `json:"username"` Age string `json:"age"` FristName string `json:"frist_name"` } type UserLists struct { Id uint64 `json:"id"` Username string `json:"username"` Age string `json:"age"` } type myLists struct { FristName string `json:"frist_name"` Lists []UserLists `json:"lists"` } var resp []myLists // 使用map进行分组,提高效率 firstNameMap := make(map[string][]UserLists) for _, rs := range rss { var t r err := json.Unmarshal([]byte(rs), &t) if err != nil { fmt.Println("Unmarshal error:", err) return } tul := UserLists{Id: t.Id, Username: t.Username, Age: t.Age} firstNameMap[t.FristName] = append(firstNameMap[t.FristName], tul) } for firstName, userList := range firstNameMap { resp = append(resp, myLists{FristName: firstName, Lists: userList}) } // 将结果转换为JSON格式输出 jsonData, err := json.MarshalIndent(resp, "", " ") if err != nil { fmt.Println("Marshal error:", err) return } fmt.Println(string(jsonData)) }
代码首先模拟数据库查询结果,实际应用中需替换为数据库查询代码。然后,代码遍历模拟数据,使用json.Unmarshal
将JSON字符串转换为r
结构体,再将r
结构体数据填充到UserLists
结构体。最后,代码根据frist_name
将UserLists
结构体添加到对应的myLists
结构体中。 最终结果resp
是一个myLists
结构体切片,包含所需数据结构。最后,代码使用json.MarshalIndent
将结果转换为格式化的JSON字符串输出。 改进后的代码使用了map进行分组,避免了多次遍历,提高了代码效率。