V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wo642436249
V2EX  ›  Go 编程语言

刚实际接触不久 go, golang 如何获取我想要的数据结构,发现 map 并不是那么灵活,可能我知道的太少了,如正文

  •  
  •   wo642436249 · 2019-07-04 17:24:37 +08:00 · 4091 次点击
    这是一个创建于 1748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我从数据库中查到了一些数据,最后组装了一个 map,这是 map 数据: [2016:[{{19}鹰眼 (美国漫威漫画旗下超级英雄) 1461602767}] 2019:[{{18}蜘蛛侠 1561602685} {{16}美国队长 (美国漫威漫画旗下超级英雄) 1561518720} {{15}黑寡妇 (美国漫威漫画旗下超级英雄) 1561518360} {{14}复仇者联盟 1561511786} {{12}钢铁侠( Iron Man ) 1561427220}]] 其中 key 是 2016 和 2019 可能会有 2018 和 2017,最终我想要的是从 2019 到 2018 到 2017 到 2016,而不是 2016 到 2017 到 2018 到 2019,或者是其他顺序。

    25 条回复    2019-07-06 03:41:56 +08:00
    haozibi
        1
    haozibi  
       2019-07-04 17:27:46 +08:00
    map 是没有顺序的,剩下的没看懂
    raynor2011
        2
    raynor2011  
       2019-07-04 17:28:30 +08:00 via Android
    你需要 ordered_map
    whileFalse
        3
    whileFalse  
       2019-07-04 17:29:26 +08:00 via iPhone
    你以前是写啥的……
    把 key 拿出来排个序,或者找找有没有 ordermap,或者改用数组
    wo642436249
        4
    wo642436249  
    OP
       2019-07-04 17:30:04 +08:00
    @haozibi map 中的 key 值是年,例如 2019、2018、2017 这样的,最后想要的数据是从大到小排序的数据结构,但是 key 依旧还是年
    wo642436249
        5
    wo642436249  
    OP
       2019-07-04 17:30:43 +08:00
    @whileFalse 这不用问,一猜就是 php,哈哈
    qq976739120
        6
    qq976739120  
       2019-07-04 17:33:09 +08:00
    map 无序的,另外.处理嵌套的数据结构的时候,那才是真的各种麻烦
    haozibi
        7
    haozibi  
       2019-07-04 17:36:47 +08:00
    map 应该不能实现这个功能,只能用 slice 辅助
    Vegetable
        8
    Vegetable  
       2019-07-04 17:37:26 +08:00
    没有
    hashmap 无序是比较常规的设计.很多语言都提供了有序 map,不过出镜率也不高
    这个需求我也推荐自己维护顺序,循环两次输出.

    可能就是 go 的一种设计思想吧,也许以后会补上很多缺少的东西,现在来看,内置库还有很多可以加的东西.
    wo642436249
        9
    wo642436249  
    OP
       2019-07-04 17:41:20 +08:00
    @haozibi 想过用那个,但是得到数据结构不是想要的,之前用 php 的数组得到的数据结构是一个多维数组,类似于
    [
    '2019' => [
    [
    'title' => '哈哈哈',
    'time' => '2019-06'
    ],
    [
    'title' => '啦啦啦',
    'time' => '2019-05'
    ],
    ],
    '2018' => [
    [
    'title' => '嘎嘎嘎',
    'time' => '2018-06'
    ],
    [
    'title' => '噜噜噜',
    'time' => '2017-05'
    ],
    ],
    ]
    haozibi
        10
    haozibi  
       2019-07-04 17:47:07 +08:00
    @wo642436249 #9 这个可以实现呀 `make([]map[string]interface{}, 0)`,不过最好 interface 换成具体的 struct
    wo642436249
        11
    wo642436249  
    OP
       2019-07-04 19:08:35 +08:00 via Android
    我最后获取到的是按照年份正序的,如何换为倒序的
    dic
        12
    dic  
       2019-07-04 20:20:38 +08:00 via Android
    定义一个 map 的别名类型,实现 sort 接口
    wo642436249
        13
    wo642436249  
    OP
       2019-07-04 22:05:00 +08:00 via Android
    @dic 明天做做,做不出来了再问你
    liulaomo
        14
    liulaomo  
       2019-07-04 22:24:57 +08:00
    开个长度为 3000 的数组或者切片,下标表示年份,:)
    jinliming2
        15
    jinliming2  
       2019-07-05 08:09:58 +08:00 via iPhone
    @liulaomo ???长度为 3000 ?
    wo642436249
        16
    wo642436249  
    OP
       2019-07-05 08:35:06 +08:00
    @liulaomo 哈哈,高就是高,反正能解决问题,666
    wo642436249
        17
    wo642436249  
    OP
       2019-07-05 08:37:36 +08:00
    @haozibi 数据结构是能实现,我用的就是你说的这个思路,关键是那个按照年费的排序,总是按照年份正序,而不是倒序
    leopku
        18
    leopku  
       2019-07-05 08:58:37 +08:00
    推荐一个我常用的库 gubrak

    ```
    import "github.com/novalagung/gubrak"

    type HashMap map[string]string

    data := []HashMap{
    {"name": "grayson", "hobby": "helping people"},
    {"name": "jason", "hobby": "punching people"},
    {"name": "tim", "hobby": "stay awake all the time"},
    {"name": "damian", "hobby": "getting angry"},
    }

    result, err := gubrak.KeyBy(data, func(each HashMap) string {
    return each["name"]
    })
    if err != nil {
    log.Fatal(err.Error())
    }

    fmt.Println(result)
    /*
    map[string]main.HashMap {
    "grayson": main.HashMap{ "hobby": "helping people", "name": "grayson" },
    "jason": main.HashMap{ "name": "jason", "hobby": "punching people" },
    "tim": main.HashMap{ "name": "tim", "hobby": "stay awake all the time" },
    "damian": main.HashMap{ "name": "damian", "hobby": "getting angry" },
    }
    */
    ```
    aimerforreimu
        19
    aimerforreimu  
       2019-07-05 09:24:07 +08:00
    建议使用数组 struct,感觉你的格式是同统一的

    ```go
    type bar struct{
    time int
    title string
    }
    var foo []bar

    ...

    ```
    aimerforreimu
        20
    aimerforreimu  
       2019-07-05 09:24:42 +08:00
    gorm 的数据库 order 其实就是这么做的
    wo642436249
        21
    wo642436249  
    OP
       2019-07-05 09:45:47 +08:00
    @aimerforreimu 这样的数据结构不是我预期的数据结构,我预期的数据结构是以年为 key,以[]为 value 的一个变量,按照你的做法做,我没办法以年为 key
    Hanggi
        22
    Hanggi  
       2019-07-05 12:06:26 +08:00
    你应该用结构体构建每一个项目,然后把这些项目整合进一个数组之类的或者别的数据结构里,方便查找。
    wo642436249
        23
    wo642436249  
    OP
       2019-07-05 14:54:26 +08:00
    @Hanggi 我想要的那种数据结构能实现不,并且保证排序也是我想要的
    daemonk
        24
    daemonk  
       2019-07-05 15:39:59 +08:00
    TreeMap
    liulaomo
        25
    liulaomo  
       2019-07-06 03:41:56 +08:00
    @jinliming2 3000 只是个保险数字,实际上 200 年就够了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3855 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:41 · PVG 18:41 · LAX 03:41 · JFK 06:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.