V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
RedisMasterNode
V2EX  ›  Go 编程语言

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

  •  
  •   RedisMasterNode · 169 天前 · 3044 次点击
    这是一个创建于 169 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    21 条回复    2024-06-20 13:21:06 +08:00
    kneo
        1
    kneo  
       169 天前 via Android
    看不见你发的啥玩意……
    povsister
        2
    povsister  
       169 天前
    自己搓个递归 reflect 初始化。
    另外,go 读 nil map 并不会 panic ,你代码的 pattern 是先读,判不存在然后初始化。
    读中混写,隐藏两个问题
    1. 并发读 map 带来写 race
    2. 不存在的 key 造成重新初始化

    总结,代码设计太烂
    monkeyWie
        3
    monkeyWie  
       169 天前
    看起来像是偷懒不想声明 struct ,然后用 map 导致写起来更麻烦了
    billbur
        4
    billbur  
       169 天前
    这什么鬼这么长,索引路径可以用一个字符串来做吧,key 就用"a.b.c.e.f"
    RedisMasterNode
        5
    RedisMasterNode  
    OP
       169 天前
    PS: 是朋友给的网图,但是还是觉得很有意思,并且也是 Go 里面偶尔会碰到的情况(当有人偷懒不定义结构体时就会这样)
    dyllen
        6
    dyllen  
       169 天前
    确实挺丑的,看花眼。嵌套的 map 可以重新定义个类型,取个名字,好分辨。
    Vegetable
        7
    Vegetable  
       169 天前   ❤️ 3
    这种写法,无论什么语言的 map 写出来都是依托狗屎啊
    fruitmonster
        8
    fruitmonster  
       169 天前
    之前写代码发现一个好用的包: https://github.com/tidwall/gjson
    ns09005264
        9
    ns09005264  
       169 天前
    就算是都用 map ,至少搞个别名 type 吧。
    RedisMasterNode
        10
    RedisMasterNode  
    OP
       169 天前
    @Vegetable python 会略好一点哈哈哈,但是当然本质上是人的问题不是
    gitrebase
        11
    gitrebase  
       169 天前
    不是,什么语言的 map 初始化能契合这个鬼需求?
    jfcai
        12
    jfcai  
       169 天前
    怎么看着像是段子。
    CEBBCAT
        13
    CEBBCAT  
       169 天前
    分析 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
        14
    CEBBCAT  
       169 天前
    @billbur #4 衷心劝告楼上老哥三思用 fmt.Sprintf() 做 map 的 key
    8355
        15
    8355  
       169 天前
    代码提交量挺大啊。。
    leonshaw
        16
    leonshaw  
       169 天前   ❤️ 1
    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
        17
    Trim21  
       169 天前
    有泛型了写个 setDefault 就行了
    james122333
        18
    james122333  
       169 天前 via Android
    还是写 php 爽
    whimsySun
        19
    whimsySun  
       168 天前
    看到这样的代码不删了,还想着怎么初始化呢
    lasuar
        20
    lasuar  
       168 天前
    谁写的,裁了
    CEBBCAT
        21
    CEBBCAT  
       154 天前
    😓要知道是网图➕没有后续就不费那心思写回复了,完全纸上谈兵啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.