1 回答

TA貢獻1802條經驗 獲得超5個贊
您可以根據需要初始化嵌套地圖 - 您不必初始化可能的 lat、lng 對的整個范圍。
問題是make(map[string]map[string][]map[string]string)正在初始化stringtomap[string][]map[string]string的地圖而不是 to 的string地圖[]map[string]string。因此,當您分配零件時可以,但零件的映射latLngMap[lat][lng]未初始化(它們是)。[lat][lng]nil
因此,您需要做的就是latLngMap[lat]在將任何內容放入其中之前初始化其中的地圖。您可以在緯度上的 for 循環中執行此操作。
//Already have 'siteIDMap' created in above code not shown
//Init map of Lat/Lng to site data
latLngMap := make(map[string]map[string][]map[string]string)
// for every site in map
for k, v := range siteIDMap {
loc := v["loc"]
lat := v["lat"]
lng := v["lng"]
name := v["name"]
// initialize nested map for this lat if it was not already initialized
// by a previous iteration
_, ok := latLngMap[lat]
if !ok {
latLngMap[lat] = make(map[string][]map[string]string)
latLngMap[lat][lng] = make([]map[string]string, 1)
}
m := map[string]string{"id": k, "lat": lat, "lng": lng, "loc": loc, "name": name}
latFloor := strings.Split(lat, ".")[0]
lngFloor := strings.Split(lng, ".")[0]
fmt.Println(m, latFloor, lngFloor)
latLngMap[latFloor][lngFloor] = append(latLngMap[latFloor][lngFloor], m)
}
請注意,我還更改了在嵌套地圖中創建切片的位置。如果兩個地方具有相同的 lat、lng,這將防止出現錯誤。以前如果有兩個,第一個將被第二個覆蓋。
這是在Go Playground中運行的代碼的簡化版本。
- 1 回答
- 0 關注
- 174 瀏覽
添加回答
舉報