• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang validator参数校验的实现
    POST TIME:2021-10-18 17:21

    今天在改后台页面,参数校验错误时输出全是英文,使用着很难看懂到底时什么错了
    故而决定去做i18n前端国际化. 改的时候踩了很多坑,故而记录一下,顺便记录以下查问题的方式。

    效果

    从原来的Title is required变为标题为必填字段

    完成后的代码:

    这里主要定义了初始化了一个中文的trans和Validate的变量,并对其做初始化
    初始化主要做了以下事情:

    注册了TagName函数
    // RegisterTagNameFunc registers a function to get alternate names for StructFields.
    这个方法主要就是提供一个tag的解析器,返回一个Field替代的字符串
    我自己是定义了一个label的tag用于替换

    注册了validate的翻译函数
    直接使用了原来提供的中文转换,对required等标签做对应的国际化

    package service
    
    import (
      zhongwen "github.com/go-playground/locales/zh"
      ut "github.com/go-playground/universal-translator"
      "github.com/go-playground/validator/v10"
      zh_translations "github.com/go-playground/validator/v10/translations/zh"
      "reflect"
      "strings"
    )
    
    var Validate *validator.Validate
    var trans ut.Translator
    
    func init() {
      zh := zhongwen.New()
      uni := ut.New(zh, zh)
      trans, _ = uni.GetTranslator("zh")
    
      Validate = validator.New()
      Validate.RegisterTagNameFunc(func(field reflect.StructField) string {
        label := field.Tag.Get("label")
        if label == "" {
          return field.Name
        }
        return label
      })
      zh_translations.RegisterDefaultTranslations(Validate, trans)
    }
    func Translate(errs validator.ValidationErrors) string {
      var errList []string
      for _, e := range errs {
        // can translate each error one at a time.
        errList = append(errList,e.Translate(trans))
      }
      return strings.Join(errList,"|")
    }
    
    

    调用方式

    type ArticlesPost struct {
      Title      string `json:"title" validate:"required,max=32,min=4" label:"标题"`
    }
    var ap ArticlePost
    err = service.Validate.Struct(ap)
    if err!=nil{
     errStr =Translate(errs)
     fmt.Sprintln(errStr)
    }
    

    思路

    第一个是设置一个新的tag来替换validate,另一个的说明是注册一个方法来为结构体字段获取替换的名字

    仔细看看说明,果然就是这个,在看看TagNameFunc的签名,参数是reflect.StructField,能够拿到tag等一系列信息

    // TagNameFunc allows for adding of a custom tag name parser
    type TagNameFunc func(field reflect.StructField) string
    // SetTagName allows for changing of the default tag name of 'validate'
    func (v *Validate) SetTagName(name string) {
      v.tagName = name
    }
    
    // RegisterTagNameFunc registers a function to get alternate names for StructFields.
    //
    // eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names:
    //
    //  validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
    //    name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
    //    if name == "-" {
    //      return ""
    //    }
    //    return name
    //  })
    func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {
      v.tagNameFunc = fn
      v.hasTagNameFunc = true
    }
    
    

    至此,终于找到了正确的解决方案

    总结

    在这里发现为了解决这个问题走了很多弯路,查了一大堆资料才发现甚至原来就有提供该功能。

    发现自己的几个问题:

    到此这篇关于golang validator参数校验的实现的文章就介绍到这了,更多相关golang validator参数校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • golang之数据校验的实现代码示例
    • golang常用库之字段参数验证库-validator使用详解
    • golang之数据验证validator的实现
    上一篇:golang之数据验证validator的实现
    下一篇:golang jwt+token验证的实现
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信