How to add into map in range loop

我是研究僧i 提交于 2019-12-11 12:51:44

问题


package main

import (
    "fmt"
)

func main() {
    m := make(map[int]int, 4)
    m[1] = 0
    m[2] = 0
    for k, _ := range m {
        i := 10 + k
        m[i] = 0
    }
    fmt.Println(m)
    fmt.Println("len:", len(m))
}

This code returns: 8 or 10 or 6 as length of map after loop. Video is here, playgroud here.

I see that new added elements go into range, but can't explain why this loop stops randomly?


回答1:


Spec: For statements:

The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next. If a map entry that has not yet been reached is removed during iteration, the corresponding iteration value will not be produced. If a map entry is created during iteration, that entry may be produced during the iteration or may be skipped. The choice may vary for each entry created and from one iteration to the next. If the map is nil, the number of iterations is 0.

The spec states that if you add entries to the map you are ranging over, the elements you add may or may not be visited by the loop, and moreover, which is visited is not even deterministic (may change when doing it again).




回答2:


You are modifying map you are iterating over. This is the cause.



来源:https://stackoverflow.com/questions/55399243/how-to-add-into-map-in-range-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!