我需要有一個string作為鍵和唯一(無重復)int64陣列作為值的映射,所以我決定使用類似下面的東西,以便值可以作為一個集合。
var customerCatalog = make(map[string]map[int64]bool)
上面的地圖中填充了一些資料。現在我正在嘗試通過閱讀常規地圖上方的內容來填充我在 golang 中的并發地圖customerCatalog,但出現錯誤:
for k, v := range customerCatalog {
r.customerCatalog.Upsert(k, v, func(exists bool, valueInMap interface{}, newValue interface{}) interface{} {
typedNewValue := newValue.([]int64)
if !exists {
return typedNewValue
}
typedValueInMap := valueInMap.([]int64)
return append(typedValueInMap, typedNewValue...)
})
}
這是我得到的錯誤。我正在使用 upsert 方法,如此處所示
panic: interface conversion: interface {} is map[int64]bool, not []int64
我在做什么錯?
uj5u.com熱心網友回復:
我相信您的問題的一個最小的、可重現的示例如下(操場):
conMap := cmap.New()
v := map[int64]bool{}
updateItemFn := func(exist bool, valueInMap interface{}, newValue interface{}) interface{} {
_ = newValue.([]int64)
return nil
}
conMap.Upsert("foo", v, updateItemFn)
注意:我已經去掉了回圈等,因為這與恐慌無關。但是你應該注意,因為回圈遍歷了willmap[string]map[int64]bool的型別。vmap[int64]bool
該Upsert函式在地圖中查找鍵,然后將其value傳遞給函式。
所以你的函式正在接收 amap[int64]bool并且它做的第一件事就是斷言這是 a []int64(這將失敗,因為它不是)。要解決此問題,您需要將 轉換map[int64]bool為[]int64. 這可以在呼叫Upsert或在您的實作中完成,UpsertCb如下所示(游樂場):
conMap := cmap.New()
conMap.Set("foo", []int64{5, 6})
v := map[int64]bool{
1: true,
}
updateItemFn := func(exist bool, valueInMap interface{}, newValue interface{}) interface{} {
m := newValue.(map[int64]bool)
a := make([]int64, 0, len(m))
for k := range m {
a = append(a, k)
}
if valueInMap == nil { // New value!
return a
} else {
typedValueInMap := valueInMap.([]int64)
return append(typedValueInMap, a...)
}
return a
}
conMap.Upsert("foo", v, updateItemFn)
fmt.Println(conMap.Get("foo"))
上述內容保持簡單以說明這一點;實際上,您可能希望將所有值添加到地圖中以避免重復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438839.html
