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

202 天前
 RedisMasterNode

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

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

总结,代码设计太烂
monkeyWie
202 天前
看起来像是偷懒不想声明 struct ,然后用 map 导致写起来更麻烦了
billbur
202 天前
这什么鬼这么长,索引路径可以用一个字符串来做吧,key 就用"a.b.c.e.f"
RedisMasterNode
202 天前
PS: 是朋友给的网图,但是还是觉得很有意思,并且也是 Go 里面偶尔会碰到的情况(当有人偷懒不定义结构体时就会这样)
dyllen
202 天前
确实挺丑的,看花眼。嵌套的 map 可以重新定义个类型,取个名字,好分辨。
Vegetable
202 天前
这种写法,无论什么语言的 map 写出来都是依托狗屎啊
fruitmonster
202 天前
之前写代码发现一个好用的包: https://github.com/tidwall/gjson
ns09005264
202 天前
就算是都用 map ,至少搞个别名 type 吧。
RedisMasterNode
202 天前
@Vegetable python 会略好一点哈哈哈,但是当然本质上是人的问题不是
gitrebase
202 天前
不是,什么语言的 map 初始化能契合这个鬼需求?
jfcai
202 天前
怎么看着像是段子。
CEBBCAT
202 天前
分析 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
202 天前
@billbur #4 衷心劝告楼上老哥三思用 fmt.Sprintf() 做 map 的 key
8355
202 天前
代码提交量挺大啊。。
leonshaw
202 天前
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
202 天前
有泛型了写个 setDefault 就行了
james122333
202 天前
还是写 php 爽
whimsySun
201 天前
看到这样的代码不删了,还想着怎么初始化呢
lasuar
201 天前
谁写的,裁了

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

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

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

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

© 2021 V2EX