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 关注
- 135 浏览
添加回答
举报