鍍金池/ 問(wèn)答/GO  網(wǎng)絡(luò)安全/ go語(yǔ)言map遍歷時(shí)添加新key/value,此情況是如何工作的?

go語(yǔ)言map遍歷時(shí)添加新key/value,此情況是如何工作的?

做了如下測(cè)試

代碼:

func main() {
    map1 := map[string]int{
        "a": 1,
        "b": 2,
        "c": 3,
        "d": 4,
    }
    for k, v := range map1 {
        fmt.Println(k, ":", v)
        map1[string(k[0]+1)] = v + 1
    }
}

輸出:

API server listening at: 127.0.0.1:20657
c : 3
d : 4
e : 5
f : 6
g : 7
h : 8
a : 1
b : 2

多次執(zhí)行的結(jié)果都是不一樣的,但是都是有限次數(shù)(最高8次)
為何不會(huì)一直循環(huán)下去 還有這樣是如何工作的

回答
編輯回答
大濕胸
  1. range map的時(shí)候,訪問(wèn)序列是隨機(jī)的,所以會(huì)看到多次遍歷打印序列不同
  2. 無(wú)鎖情況下,如果在遍歷的時(shí)候同時(shí)刪除一個(gè)key,并且key沒(méi)有被訪問(wèn)過(guò),不會(huì)有問(wèn)題
  3. 無(wú)鎖,遍歷map同時(shí)增加一個(gè)key,那么這個(gè)key有可能被本次遍歷訪問(wèn)到,也可能不會(huì)被訪問(wèn)到
2017年8月21日 22:01
編輯回答
莓森

golang的map是hash表實(shí)現(xiàn)的,hash表的遍歷就是遍歷所有的桶,所以新添加的元素可能出現(xiàn)在之前遍歷過(guò)的桶中,這樣就會(huì)有些新添加的元素可能遍歷不到。
實(shí)際生成環(huán)境中,不建議遍歷一個(gè)正在寫(xiě)入的map,這并不是一種好的設(shè)計(jì),如果確實(shí)有這樣的需求,要特別注意rehash操作內(nèi)存重新分配,原來(lái)遍歷的指針可能失效導(dǎo)致core掉。

2018年1月1日 07:14
編輯回答
柚稚

朋友給發(fā)了個(gè)文章鏈接
Go Range 內(nèi)部實(shí)現(xiàn)http://www.jianshu.com/p/35c2...

2018年5月14日 02:01