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