golang如何把一个list遍历给一个切片

我查询mysql 得到3条list对象,伪代码如

查询的结果:
 {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 myLists struct{
    FristName string `json:"frist_name"`
    Lists []UserLists  `json:"lists"`
}

type UserLists struct{
    Id string
    Username string
    Age string
}

最终想实现

 {
    "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"
    }]
 }

我想把查询出来的结果放到这个结构体里面。。
请问怎么实现。

阅读 4.1k
2 个回答

自己写一段代码实现喽,从 第一个 for 循环开始,替换为自己的数据源在处理喽.

package main

import "encoding/json"

import "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
        Username string
        Age      string
    }

    type myLists struct {
        FristName string      `json:"frist_name"`
        Lists     []UserLists `json:"lists"`
    }
    var resp []myLists

    for _, rs := range rss {
        var t r
        err := json.Unmarshal([]byte(rs), &t)
        if err != nil {
            fmt.Println(err.Error())
            return
        }
        var tul = UserLists{Id: t.Id, Username: t.Username, Age: t.Age}
        if len(resp) == 0 {
            var tml = myLists{FristName: t.FristName}
            tml.Lists = append(tml.Lists, tul)
            resp = append(resp, tml)
        } else {
            var listFound = false
            for i := 0; i < len(resp); i++ {
                if resp[i].FristName == t.FristName {
                    resp[i].Lists = append(resp[i].Lists, tul)
                    listFound = true
                    break
                }
            }
            if !listFound {
                var tml = myLists{FristName: t.FristName}
                tml.Lists = append(tml.Lists, tul)
                resp = append(resp, tml)
            }
        }
    }

    fmt.Printf("%+v\n", resp)
}

resp,需要的话,自己再序列化下就好了

[{FristName:a Lists:[{Id:1 Username:xx Age:xx} {Id:3 Username:xx Age:xx}]} {FristName:b Lists:[{Id:2 Username:xx Age:xx}]}]

由于目标数据可由键值对组成,使用map结构更清晰

package main

import (
    "encoding/json"
    "fmt"
)

type myLists struct {
    FristName string      `json:"frist_name"`
    Lists     []UserLists `json:"lists"`
}

type UserLists struct {
    Id       int    `json:"id"`
    Username string `json:"username"`
    Age      string `json:"age"`
}

var jsonStr = `[{"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"}]`

func main() {
    var lists []UserLists
    err := json.Unmarshal([]byte(jsonStr), &lists)
    if err != nil {
        fmt.Println("error:", err)
    }

    //1. id --> user 通过id查找
    users := make(map[int]UserLists)
    for _, v := range lists {
        users[v.Id] = v
    }

    //2. firstName-> id 映射
    var mList []struct {
        Id        int    `json:"id"`
        FristName string `json:"frist_name"`
    }
    err = json.Unmarshal([]byte(jsonStr), &mList)
    if err != nil {
        fmt.Println("error:", err)
    }

    //3,firstName -> []UserLists
    m := make(map[string][]UserLists)
    for _, v := range mList {
        if _, ok := m[v.FristName]; !ok {
            m[v.FristName] = []UserLists{users[v.Id]}
            continue
        }
        m[v.FristName] = append(m[v.FristName], users[v.Id])
    }

    //4. 将m转为 myLists结构体
    my := []myLists{}
    for k, v := range m {
        my = append(my, myLists{FristName: k, Lists: v})
    }
    // 结构体
    fmt.Printf("%+v", my)
    // json
 
    fmt.Println()
    b, err := json.Marshal(my)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b)
}

打印效果

[{FristName:a Lists:[{Id:1 Username:xx Age:xx} {Id:3 Username:xx Age:xx}]} {FristName:b Lists:[{Id:2 Username:xx Age:xx}]}]

[{"frist_name":"a","lists":[{"id":1,"username":"xx","age":"xx"},{"id":3,"username":"xx","age":"xx"}]},{"frist_name":"b","lists":[{"id":2,"username":"xx","age":"xx"}]}]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题