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

2019-07-04 17:24:37 +08:00
 wo642436249

我从数据库中查到了一些数据,最后组装了一个 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,或者是其他顺序。

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

可能就是 go 的一种设计思想吧,也许以后会补上很多缺少的东西,现在来看,内置库还有很多可以加的东西.
wo642436249
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
2019-07-04 17:47:07 +08:00
@wo642436249 #9 这个可以实现呀 `make([]map[string]interface{}, 0)`,不过最好 interface 换成具体的 struct
wo642436249
2019-07-04 19:08:35 +08:00
我最后获取到的是按照年份正序的,如何换为倒序的
dic
2019-07-04 20:20:38 +08:00
定义一个 map 的别名类型,实现 sort 接口
wo642436249
2019-07-04 22:05:00 +08:00
@dic 明天做做,做不出来了再问你
liulaomo
2019-07-04 22:24:57 +08:00
开个长度为 3000 的数组或者切片,下标表示年份,:)
jinliming2
2019-07-05 08:09:58 +08:00
@liulaomo ???长度为 3000 ?
wo642436249
2019-07-05 08:35:06 +08:00
@liulaomo 哈哈,高就是高,反正能解决问题,666
wo642436249
2019-07-05 08:37:36 +08:00
@haozibi 数据结构是能实现,我用的就是你说的这个思路,关键是那个按照年费的排序,总是按照年份正序,而不是倒序
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
2019-07-05 09:24:07 +08:00
建议使用数组 struct,感觉你的格式是同统一的

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

...

```
aimerforreimu
2019-07-05 09:24:42 +08:00
gorm 的数据库 order 其实就是这么做的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/580064

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX