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向他们发送信号,让他们在测距时开始工作。然而,进程可以创建子进程,子进程也可以自己创建子进程。若进程创建了一个子进程,我还需要向该子进程发送开始信号。因为我不知道创建子进程的深度,所以在迭代之后我不能这样做。嗯,对于听起来非常复杂的东西来说,映射可能根本不是正确的结构。