Dictionary 定义地图切片的地图地图,带有;转让给“无”;错误,是否动态预填充或生成关键点?

Dictionary 定义地图切片的地图地图,带有;转让给“无”;错误,是否动态预填充或生成关键点?,dictionary,go,Dictionary,Go,我是个新手,正在用它来处理数据 我有一个python程序,它将json输入作为dict列表的dict,如下所示: { "64": { "-117": [{ "lat": 64.1121952, "loc": "Northwest Territories", "lon": -117.3

我是个新手,正在用它来处理数据

我有一个python程序,它将json输入作为dict列表的dict,如下所示:

{
    "64": {
        "-117": [{
            "lat": 64.1121952,
            "loc": "Northwest Territories",
            "lon": -117.3539847,
            "id": "GmtNT",
            "name": "Gameti"
        }],
        "-147": [{
            "lat": 64.838,
            "loc": "Alaska",
            "lon": -147.716,
            "id": "FairbanksAK",
            "name": "Fairbanks"
        },
        {
            "lat": 64.9,
            "loc": "Alaska",
            "lon": -147.4,
            "id": "IcFgObAK",
            "name": "Icefog Observatory"
        }]
    },
    "71": {
        "-125": [{
            "lat": 71.985123,
            "loc": "Northwest Territories",
            "lon": -125.2464831,
            "id": "SchshrbrNT",
            "name": "Sachs Harbour"
        }]
    }
}
我正在编写一个Go脚本来生成这个json作为输入。我已经有了一个可以将数据转换成这种格式的go脚本:

siteIDMap := make(map[string]map[string]string)
终端中的样本输出:

map[
 CydrvrNU: map[loc:Nunavut lat:70.476365 lng:-68.6012651 name:Clyde River]
 UkhktkNT: map[loc:Northwest Territories lat:70.7367504 lng:-117.7704441 name:Ulukhaktok]
 PrdhByAK: map[loc:Alaska lat:70.254704 lng:-148.3406 name:Prudhoe Bay]
 SchshrbrNT: map[loc:Northwest Territories lat:71.985123 lng:-125.2464831 name:Sachs Harbour]
]
然而,我在最后一步遇到了麻烦。我已经能够尝试并初始化我怀疑是正确的数据类型
latLngMap:=make(map[string]map[string][]map[string]string)
,并尝试填充它,但显然不能不初始化每个lat/lng组合

到目前为止,我要做的代码如下:

//Already have 'siteIDMap' created in above code not shown

slice2 := []map[string]string{} //empty slice that can be added to

//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"]

    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(slice2, m)

}
最后一行给出了错误
panic:assignment to entry in nil map
,这很有意义,因为lat/lng值尚未作为键输入map中

但是对于像这样笨拙的东西,我该如何初始化它呢

我是否需要
map[-89至+89]lat
,对于每个
map[-89至+89]lng
,对于每个:
[]map[string]string{}

如果我这样做,可能90%的lat/lon组合将完全为空。似乎是一种可怕的浪费

如何在生成此数据结构时创建它


我曾考虑过为这种大型嵌套数据类型创建一个结构,但我还是新手,不确定这是否有帮助。

您可以根据需要初始化嵌套映射-您不必初始化所有可能的lat、lng对

问题是
make(map[string]map[string][]map[string]string)
正在初始化
string
map[string][]的映射,而不是
string
[]映射[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相同,这将防止出现错误。以前,如果有两个,第一个将被第二个覆盖

这是运行在中的代码的简化版本。

进行了一次小的编辑(应该使用LatFloor作为键,而不是Lat),但除此之外,这是完美的。谢谢