Golang Go语言中map数据初始化应该怎么做,这代码太丑陋了

发布于 1周前 作者 sinazl 来自 Go语言

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


Golang Go语言中map数据初始化应该怎么做,这代码太丑陋了
22 回复

看不见你发的啥玩意……

更多关于Golang Go语言中map数据初始化应该怎么做,这代码太丑陋了的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


自己搓个递归 reflect 初始化。
另外,go 读 nil map 并不会 panic ,你代码的 pattern 是先读,判不存在然后初始化。
读中混写,隐藏两个问题
1. 并发读 map 带来写 race
2. 不存在的 key 造成重新初始化

总结,代码设计太烂

看起来像是偷懒不想声明 struct ,然后用 map 导致写起来更麻烦了

这什么鬼这么长,索引路径可以用一个字符串来做吧,key 就用"a.b.c.e.f"

PS: 是朋友给的网图,但是还是觉得很有意思,并且也是 Go 里面偶尔会碰到的情况(当有人偷懒不定义结构体时就会这样)

确实挺丑的,看花眼。嵌套的 map 可以重新定义个类型,取个名字,好分辨。

这种写法,无论什么语言的 map 写出来都是依托狗屎啊

之前写代码发现一个好用的包: https://github.com/tidwall/gjson

就算是都用 map ,至少搞个别名 type 吧。

python 会略好一点哈哈哈,但是当然本质上是人的问题不是

不是,什么语言的 map 初始化能契合这个鬼需求?

怎么看着像是段子。

分析 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 )

#4 衷心劝告楼上老哥三思用 fmt.Sprintf() 做 map 的 key

代码提交量挺大啊。。

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
}

有泛型了写个 setDefault 就行了

还是写 php 爽

看到这样的代码不删了,还想着怎么初始化呢

谁写的,裁了

😓要知道是网图➕没有后续就不费那心思写回复了,完全纸上谈兵啊

在Go语言中,map的初始化确实有一些常见的做法,可以让代码看起来更加简洁和优雅。如果你觉得现有的代码丑陋,可能是因为没有采用最佳实践。以下是一些常见的map初始化方法,可以让你的代码更加整洁:

  1. 使用make函数: 这是最常见和推荐的方法。make函数会返回一个初始化的(空的)map。

    myMap := make(map[string]int)
    
  2. 字面量初始化: 如果你需要在初始化时就填充一些键值对,可以使用map字面量。

    myMap := map[string]int{
        "one": 1,
        "two": 2,
        "three": 3,
    }
    
  3. 使用var声明和make初始化(适用于更复杂的场景): 有时候,你可能需要先声明一个map变量,然后在后续的代码中使用make进行初始化。这种方法在需要延迟初始化或条件初始化时很有用。

    var myMap map[string]int
    if someCondition {
        myMap = make(map[string]int)
    }
    

选择哪种方法取决于你的具体需求。对于大多数情况,使用make函数或字面量初始化就足够了。这两种方法都能让你的代码更加清晰和易于维护。

希望这些建议能帮助你改进代码的可读性。如果还有其他问题或需要进一步的帮助,请随时提问。

回到顶部