gpt4 book ai didi

dictionary - 定义 map slice 的 map 时,出现 “assignment to nil”错误,我是否要即时填充或生成 key ?

转载 作者:行者123 更新时间:2023-12-01 21:09:39 25 4
gpt4 key购买 nike

我是Go的新手,正在使用它进行一些数据操作
我有一个将json输入作为dict of dicts of lists of dicts的python程序,如下所示:

{
"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作为输入。我已经有一个可以运行的脚本,可以将数据转换成这种格式:
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错误,这很有意义,因为纬度/经度值尚未在 map 中作为键输入
但是对于这种笨拙的东西,我该如何初始化呢?
我是否需要 map[-89 to +89] lat,对于每个 map[-89 to +89] lng,对于每个: []map[string]string{}如果我这样做,那么大概90%的经纬度组合将完全空白。似乎是一种可怕的浪费。
如何在生成此数据结构时创建它?
我曾想过为这种大的嵌套数据类型创建一个结构,但是我是Go的新手,不确定是否/有什么帮助。

最佳答案

您可以根据需要初始化嵌套 map -不必初始化可能的经纬度对的整个范围。
问题在于make(map[string]map[string][]map[string]string)正在初始化stringmap[string][]map[string]string的映射,而不是初始化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)
}
请注意,我还更改了在嵌套 map 内创建 slice 的位置。如果两个地方的纬度,经度相同,则可以防止错误。以前,如果有两个,则第一个将被第二个覆盖。
这是在 Go Playground中运行的代码的简化版本。

关于dictionary - 定义 map slice 的 map 时,出现 “assignment to nil”错误,我是否要即时填充或生成 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62805770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com