为了账号安全,请及时绑定邮箱和手机立即绑定

定义地图切片的地图,出现“赋值为零”错误,我是否动态预填充或生成键?

定义地图切片的地图,出现“赋值为零”错误,我是否动态预填充或生成键?

Go
UYOU 2022-06-13 16:54:11
我对 Go 很陌生,并且正在使用它进行一些数据操作我有一个 python 程序,它接受 json 输入,dict of dicts of lists of dicts如下所示:{    "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 组合!
查看完整描述

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中运行的代码的简化版本。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信