Dictionary 在Golang中为地图添加密钥的安全方法

Dictionary 在Golang中为地图添加密钥的安全方法,dictionary,go,Dictionary,Go,鉴于这一事实: 如果在迭代过程中创建了映射条目,则可能会生成该条目 在迭代过程中,或可能会跳过。每种情况的选择可能有所不同 从一个迭代到下一个迭代,创建条目 在迭代期间向映射添加键值是不安全的: var m = make(map[string]int) m["1"] = 1 m["2"] = 2 m["3"] = 3 for k, v := range m { if strings.EqualFold( "2", k){ m["4"] = 4 } fmt

鉴于这一事实:

如果在迭代过程中创建了映射条目,则可能会生成该条目 在迭代过程中,或可能会跳过。每种情况的选择可能有所不同 从一个迭代到下一个迭代,创建条目

在迭代期间向映射添加键值是不安全的:

var m = make(map[string]int)
m["1"] = 1
m["2"] = 2
m["3"] = 3

for k, v := range m {
    if strings.EqualFold( "2", k){
        m["4"] = 4
    }
    fmt.Println(k, v)
}
有时产生4个键,有时不产生


使其始终生成的解决方法是什么?

使用要添加到原始映射的项目创建另一个映射,并在迭代后合并它们

var m = make(map[string]int)
m["1"] = 1 
m["2"] = 2 
m["3"] = 3 

var n = make(map[string]int)

for k := range m { 
    if strings.EqualFold("2", k) {
        n["4"] = 4 
    }   
}   

for k, v := range n { 
    m[k] = v 
}   

for _, v := range m { 
    fmt.Println(v)
}

想要的行为还不清楚。在围棋中,在地图中进行测距是无序的,如果您之前已经访问过4,该怎么办?你期待什么?请对此进行清除。@leadbebop程序保证它总是向映射中添加唯一的值。我只需要在迭代过程中看到它,无论以何种顺序。只需记住插入4,然后在遍历映射后执行。非常明显,这不是答案。你有什么未提及的限制吗?@Volker实际上是的。真正的方案是map[pid]*过程。我通过chan向他们发送信号,让他们在测距时开始工作。然而,进程可以创建子进程,子进程也可以自己创建子进程。若进程创建了一个子进程,我还需要向该子进程发送开始信号。因为我不知道创建子进程的深度,所以在迭代之后我不能这样做。嗯,对于听起来非常复杂的东西来说,映射可能根本不是正确的结构。