刚实际接触不久 go, golang 如何获取我想要的数据结构,发现 map 并不是那么灵活,可能我知道的太少了,如正文 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework

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

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

    我从数据库中查到了一些数据,最后组装了一个 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     Solana     846 人在线   最高记录 6679       SelectLanguage
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 20:18 PVG 04:18 LAX 12:18 JFK 15:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86