亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

定義地圖切片的地圖,出現“賦值為零”錯誤,我是否動態預填充或生成鍵?

定義地圖切片的地圖,出現“賦值為零”錯誤,我是否動態預填充或生成鍵?

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 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號