golang 开启routine的bug

就在刚才我发现了golang的一个bug:

func ConfigFunc(ctx * context.Context){
     type Types struct{
        Name string `json:"name"`
    }
     types:= make([]*Types, 0, 2)
     if _, err:=com. NewOrm(). Raw( `select name from config_func group by name`). QueryRows(&types);err!= nil{
        logrus. Error( "ConfigFunc:",err)
    }
     retMap:=model.SafeMap{}
     retMap.Data= make( map[ string] interface{}, 2)
     var w sync.WaitGroup
     for  _, v:= range types{
         // logrus.Info("name:",v.Name)  
         // time.Sleep(1e5)      
         go func(name string){
            w. Add( 1)
             calcData:= make([]*model.ConfigFunc, 0, 2)
            com. NewOrm(). QueryTable( "config_func"). Filter( "name",name). OrderBy( "id"). All(&calcData)
             calcStr:= ""
             for _, m:= range calcData{
                 calcStr=calcStr+to. String(m.Ratio* 100/ 100)+ "%"+m.Desc+ "+"
            }
            retMap. Lock()
            retMap.Data[name]=calcStr
            retMap. Unlock()
            w. Done()
        }(v.Name)
    }
    w. Wait()
    ctx. WriteString(com. ToJsonString(com.Result{
        Status: "200",
        Data:retMap.Data,
        Msg: "查询成功",
    }))
     return
}


就在注释的那两行,如果我随便放开一行代码,才可以从types拿到数据,

// logrus.Info("name:",v.Name)  
// time.Sleep(1e5) 

我是并发的往一个map里面设置value,开启routine的时候 ,如果不加注释中的任意一行,就会拿不到v的名字,不知道为啥,我认为是执行过快,还没有来及的分配routine的数据空间,导致无法设置值,这已经属于极端情况了。有待考察


猜你喜欢

转载自blog.csdn.net/nimei31/article/details/80749262