在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

go語言的map查找鍵值對會出錯?

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

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)
}

然后我運行如上代碼, 運行了幾次, 得到了讓我非常不理解的結(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é)果是正確的. 請問各位前輩, 我錯在了哪里?

回答
編輯回答
雅痞

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

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

這樣就可以了

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

這是因為你在遍歷maparr的同時又在往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