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

我对 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 组合!


UYOU
浏览 136回答 1
1回答

慕后森

您可以根据需要初始化嵌套地图 - 您不必初始化可能的 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 datalatLngMap := make(map[string]map[string][]map[string]string)// for every site in mapfor 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中运行的代码的简化版本。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go