go语言的map查找键值对会出错?

我在学习go语言, 然后想实现一个map的键值对转换, 我的思路是: 循环这个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)
}

然后我运行如上代码, 运行了几次, 得到了让我非常不理解的结果, 我得到的结果如下:

// 第一次
$ 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]

竟然只有第三次的结果是正确的. 请问各位前辈, 我错在了哪里?

阅读 3.6k
2 个回答

这是因为你在遍历maparr的同时又在往maparr中添加数据,有一定几率遍历到刚刚添加的数据.

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)

map是键值对的无序组合
你应该先删除,后设置

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

这样就可以了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题