记go-validator组件在并发时候崩溃

在一个gin项目中使用到了github.com/go-playground/validator/v10和github.com/go-playground/validator/v10/translations/zh

发现个很有意思的事情,如果我使用了translation中间件,在并发超过5的时候,项目就直接崩溃

通过打印堆栈日志发现在go-playground/validator/v10@v10.4.1/validator_instance.go:257到265行

if v.transTagFunc == nil {
    v.transTagFunc = make(map[ut.Translator]map[string]TranslationFunc)
}

if err = registerFn(trans); err != nil {
    return
}

m, ok := v.transTagFunc[trans]

这段注册translation的代码中使用到了线程不安全的map 并发情况下会有concurent write的报错    

修改方案:

把validation组件从中间件拆出来 变成一个全局变量使用

posted @ 2021-07-21 00:10  啊浩哥哥  阅读(316)  评论(0)    收藏  举报