我在学习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]
竟然只有第三次的结果是正确的. 请问各位前辈, 我错在了哪里?
这是因为你在遍历maparr的同时又在往maparr中添加数据,有一定几率遍历到刚刚添加的数据.