接触 golang 不久,感觉这个语法用起来跟其他语言相比麻烦不少。。。。
使用 sync.map 存储 slice 切片的数据,代码如下
curSliceI, ok := syncMap.Load(curKey)
curSlice:= curSliceI.([]int)
curSlice:= append(curSlice, curId)
golang 官方 sync.map 的 Load 方法返回的是两个参数,curSliceI 是 interface 类型,ok 是 bool 类型代表是否成功
这样的话还要多写一行来做类型转换来拿到 value,有没有啥方法可以简写成一行直接拿值,做类型转换的。。。。
而且这个 interface 类型的 curSliceI, 如果为空的话,做类型转换还会 panic 报错,还要像下面这样来再
做一次判断,有没有啥简便的写法么?
curSlice, ok := curSliceI.([]int)
if !ok {
fmt.Println("It's not ok for type")
return
}
1
MrTreasure 2020-07-23 11:15:48 +08:00
因为没有泛型,没有通用容器,后面加上泛型就不会再自己转换了
|
2
echooo0 OP @MrTreasure 看了下泛型的意义写的还挺好的 https://www.jianshu.com/p/5179ede4c4cf ,
现在 go 是用 interface 这种非侵入式的方式,还是需要手动去转换类型,对于习惯了其他语言的人估计一时有点难以适应。。。 不过听说 go2 泛型要出来了 |
3
neoblackcap 2020-07-23 15:37:59 +08:00
没有,要不你写一个函数封装一下?
|
4
bruce0 2020-07-23 16:10:22 +08:00
没有泛型,现在只能用 interface 这个,通过强转来搞
|
5
kidtest 2020-07-23 16:11:17 +08:00
感觉用 map + RWMutex 方便点,不需要做 type assert
|
6
ViggoSite 2020-07-23 16:14:20 +08:00
从来没用过这个 syncMap,使用场景是啥 (⊙ˍ⊙)
|
7
2kCS5c0b0ITXE5k2 2020-07-23 16:15:40 +08:00
|
8
wangritian 2020-07-23 17:42:56 +08:00
@ViggoSite 普通 map 在多线程同时读写时会报错,只读没事
|
10
linvon 2020-07-24 10:43:40 +08:00
建议还是 map 加锁吧,syncMap 这种黑科技用起来麻烦性能也不如自己加锁
|