Go 里面的 map 数据初始化应该怎么做,这代码太丑陋了

2024-06-05 17:18:06 +08:00
 RedisMasterNode

有没有大佬写个简单一点的 helper 帮忙处理一下这代码

3285 次点击
所在节点    Go 编程语言
21 条回复
kneo
2024-06-05 17:24:08 +08:00
看不见你发的啥玩意……
povsister
2024-06-05 17:26:03 +08:00
自己搓个递归 reflect 初始化。
另外,go 读 nil map 并不会 panic ,你代码的 pattern 是先读,判不存在然后初始化。
读中混写,隐藏两个问题
1. 并发读 map 带来写 race
2. 不存在的 key 造成重新初始化

总结,代码设计太烂
monkeyWie
2024-06-05 17:30:34 +08:00
看起来像是偷懒不想声明 struct ,然后用 map 导致写起来更麻烦了
billbur
2024-06-05 17:31:34 +08:00
这什么鬼这么长,索引路径可以用一个字符串来做吧,key 就用"a.b.c.e.f"
RedisMasterNode
2024-06-05 17:32:42 +08:00
PS: 是朋友给的网图,但是还是觉得很有意思,并且也是 Go 里面偶尔会碰到的情况(当有人偷懒不定义结构体时就会这样)
dyllen
2024-06-05 17:32:51 +08:00
确实挺丑的,看花眼。嵌套的 map 可以重新定义个类型,取个名字,好分辨。
Vegetable
2024-06-05 17:51:21 +08:00
这种写法,无论什么语言的 map 写出来都是依托狗屎啊
fruitmonster
2024-06-05 17:55:36 +08:00
之前写代码发现一个好用的包: https://github.com/tidwall/gjson
ns09005264
2024-06-05 19:00:28 +08:00
就算是都用 map ,至少搞个别名 type 吧。
RedisMasterNode
2024-06-05 19:03:42 +08:00
@Vegetable python 会略好一点哈哈哈,但是当然本质上是人的问题不是
gitrebase
2024-06-05 19:07:15 +08:00
不是,什么语言的 map 初始化能契合这个鬼需求?
jfcai
2024-06-05 19:44:29 +08:00
怎么看着像是段子。
CEBBCAT
2024-06-05 19:55:59 +08:00
分析 1:楼主少贴了一部份代码,整体代码猜测是遍历 []Struct ,构造不同 Struct 分类下的 slice ,内容为 Struct 某个属性。

分析 2:因为 map[key] = append(map[key], value) 之前要保证 map 的存在,而截图中 map 其实是其他 map 的 value ,zero value 是 nil ,直接写操作会 panic

解:使用 struct 作为 key 。不要使用 string ,维护起来简直就是噩梦,凭多层 map 还能知道每一层都用的是什么做 key ,写入的时候少一层会因为类型不对而报错,要是用 string 做 key ,那类型系统一点儿都帮不了你。

注:strcut 字段类型灵活运用嵌套、指针、空指针等特性,value 如果哪天要用结构体,最好统一 new 方法(以防哪天想往 value 里面加个 map )
CEBBCAT
2024-06-05 19:57:35 +08:00
@billbur #4 衷心劝告楼上老哥三思用 fmt.Sprintf() 做 map 的 key
8355
2024-06-05 20:15:55 +08:00
代码提交量挺大啊。。
leonshaw
2024-06-05 20:34:29 +08:00
func f[K1, K2 comparable, V any, M ~map[K2]V](m map[K1]M, k K1) M {
t, ok := m[k]
if !ok {
t = make(M)
m[k] = t
}
return t
}
Trim21
2024-06-05 21:14:48 +08:00
有泛型了写个 setDefault 就行了
james122333
2024-06-05 22:44:33 +08:00
还是写 php 爽
whimsySun
2024-06-06 08:44:21 +08:00
看到这样的代码不删了,还想着怎么初始化呢
lasuar
2024-06-06 16:36:50 +08:00
谁写的,裁了

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

https://yangjunhui.monster/t/1047093

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

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

© 2021 V2EX