使用goroutine插入地图时出现问题

使用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

我是刚来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(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的地图上说:

映射是一种类型的无序元素组


如果顺序对您的应用程序很重要,那么使用切片。

为什么它像什么?随机顺序?或者你为什么会出错?哪一个?预期的结果是随机的,因为插入的例程在不同的时间完成。我相信你的意思是什么,哪一个?哪个错误?您得到的是一个致命错误:并发映射写入。因为并发写入映射是不安全的。您需要某种类型的显式同步,例如互斥,不,没有。