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的数据空间,导致无法设置值,这已经属于极端情况了。有待考察


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值