鍍金池/ 問(wèn)答/GO  網(wǎng)絡(luò)安全/ go語(yǔ)言的map查找鍵值對(duì)會(huì)出錯(cuò)?

go語(yǔ)言的map查找鍵值對(duì)會(huì)出錯(cuò)?

我在學(xué)習(xí)go語(yǔ)言, 然后想實(shí)現(xiàn)一個(gè)map的鍵值對(duì)轉(zhuǎn)換, 我的思路是: 循環(huán)這個(gè)map, 先增加鍵為值的鍵值對(duì), 然后把原來(lái)值為鍵的鍵值對(duì)刪除.
于是, 我寫(xiě)出了如下代碼:

package main

import "fmt"


func main() {

    maparr := map[string]string{}
    maparr["key1"] = "100"
    maparr["key2"] = "200"
    maparr["key3"] = "300"
    maparr["key4"] = "400"
    maparr["key5"] = "500"

    for k, v := range(maparr) {
        maparr[v] = k
        delete(maparr, k)
    }
    fmt.Println(maparr)
}

然后我運(yùn)行如上代碼, 運(yùn)行了幾次, 得到了讓我非常不理解的結(jié)果, 我得到的結(jié)果如下:

// 第一次
$ go run hello.go
map[400:key4 500:key5 key2:200 100:key1 300:key3]
// 第二次
$ go run hello.go
map[200:key2 300:key3 500:key5 key4:400 100:key1]
// 第三次
$ go run hello.go
map[100:key1 200:key2 300:key3 400:key4 500:key5]

竟然只有第三次的結(jié)果是正確的. 請(qǐng)問(wèn)各位前輩, 我錯(cuò)在了哪里?

回答
編輯回答
雅痞

map是鍵值對(duì)的無(wú)序組合
你應(yīng)該先刪除,后設(shè)置

for k, v := range maparr {
    delete(maparr, k)
    maparr[v] = k
}

這樣就可以了

2018年1月1日 08:40
編輯回答
呆萌傻

這是因?yàn)槟阍诒闅vmaparr的同時(shí)又在往maparr中添加數(shù)據(jù),有一定幾率遍歷到剛剛添加的數(shù)據(jù).

maparr := map[string]string{}
    maparr["key1"] = "100"
    maparr["key2"] = "200"
    maparr["key3"] = "300"
    maparr["key4"] = "400"
    maparr["key5"] = "500"
    map2 := make(map[string]string)

    for k, v := range(maparr) {
        map2[v]=k
    }
    fmt.Println(map2)
2018年4月26日 03:22