使用goroutine插入地图时出现问题
我是刚来Golang的新手,正在学习使用goroutine。我试图通过goroutines将多个字符串同时插入map[int]字符串中使用goroutine插入地图时出现问题,go,goroutine,Go,Goroutine,我是刚来Golang的新手,正在学习使用goroutine。我试图通过goroutines将多个字符串同时插入map[int]字符串中 package main import ( "fmt" "sync" ) func input(m map[int]string, i int, wg *sync.WaitGroup){ m[i] = fmt.Sprintf("line %d\n", i+1) fmt.Print
package main
import (
"fmt"
"sync"
)
func input(m map[int]string, i int, wg *sync.WaitGroup){
m[i] = fmt.Sprintf("line %d\n", i+1)
fmt.Print(m[i])
wg.Done()
}
func GetMap(m map[int]string, wg *sync.WaitGroup) {
wg.Add(5)
for i:=0; i<5; i++{
go input(m, i, wg)
}
wg.Wait()
}
func main(){
var wg sync.WaitGroup
m1 := make(map[int]string)
GetMap(m1, &wg)
fmt.Print(m1)
}
预期:
第1行
第2行
第5行
第3行
第4行
地图[0:第1行]
1:第2行
2:第3行
3:第4行
4:第5行
]
结果:每次都不同,有时是预期结果有时是这样:
第5行
致命错误:并发映射写入
第1行
第2行
那么为什么每次我重新编译的结果都不一样呢?谢谢你首先,你的地图上有一个比赛条件。您正在跨多个goroutine共享它,而不使用任何同步机制。用一根绳子保护它 然后,在映射中存储值时,不能期望有任何给定的顺序。事实上,Go的地图上说: 映射是一种类型的无序元素组
如果顺序对您的应用程序很重要,那么使用切片。为什么它像什么?随机顺序?或者你为什么会出错?哪一个?预期的结果是随机的,因为插入的例程在不同的时间完成。我相信你的意思是什么,哪一个?哪个错误?您得到的是一个致命错误:并发映射写入。因为并发写入映射是不安全的。您需要某种类型的显式同步,例如互斥,不,没有。