V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wo642436249

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

  •  
  •   wo642436249 · Jul 4, 2019 · 4930 views
    This topic created in 2489 days ago, the information mentioned may be changed or developed.

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

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

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

    ...

    ```
    aimerforreimu
        20
    aimerforreimu  
       Jul 5, 2019
    gorm 的数据库 order 其实就是这么做的
    wo642436249
        21
    wo642436249  
    OP
       Jul 5, 2019
    @aimerforreimu 这样的数据结构不是我预期的数据结构,我预期的数据结构是以年为 key,以[]为 value 的一个变量,按照你的做法做,我没办法以年为 key
    Hanggi
        22
    Hanggi  
       Jul 5, 2019
    你应该用结构体构建每一个项目,然后把这些项目整合进一个数组之类的或者别的数据结构里,方便查找。
    wo642436249
        23
    wo642436249  
    OP
       Jul 5, 2019
    @Hanggi 我想要的那种数据结构能实现不,并且保证排序也是我想要的
    daemonk
        24
    daemonk  
       Jul 5, 2019
    TreeMap
    liulaomo
        25
    liulaomo  
       Jul 6, 2019
    @jinliming2 3000 只是个保险数字,实际上 200 年就够了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1852 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 86ms · UTC 16:20 · PVG 00:20 · LAX 09:20 · JFK 12:20
    ♥ Do have faith in what you're doing.