golang map边遍历边写
时间: 2023-08-07 21:02:44 浏览: 107
在Golang中,我们不能边遍历边写一个map,因为在并发环境下会导致不确定的结果。当多个goroutine同时操作一个map时,会引发竞态条件(race condition),导致数据不一致或者程序崩溃。
为了安全地并发访问map,可以使用互斥锁(mutex)进行同步操作。下面是一个示例代码,展示了如何在遍历map时使用互斥锁来保证并发安全:
```go
package main
import (
"fmt"
"sync"
)
func main() {
myMap := make(map[string]int)
myMap["a"] = 1
myMap["b"] = 2
myMap["c"] = 3
var wg sync.WaitGroup
var mutex sync.Mutex
wg.Add(len(myMap))
for key, value := range myMap {
go func(key string, value int) {
defer wg.Done()
mutex.Lock()
fmt.Printf("Key: %s, Value: %d\n", key, value)
mutex.Unlock()
}(key, value)
}
wg.Wait()
}
```
在上面的代码中,我们使用`sync.Mutex`来创建一个互斥锁,并在遍历map的goroutine中使用`mutex.Lock()`和`mutex.Unlock()`来保护对map的访问。
这样做可以确保每个goroutine在访问map时都会先获取锁,并在访问完成后释放锁,保证了并发安全性。
需要注意的是,这里的遍历和打印操作是并发执行的,但是对map的写操作是串行的,因为每次只有一个goroutine可以获取到锁。
阅读全文