golang表单验证库validator

suoniao 2021-01-28
需要:0索币

validator应该是Golang里进行表单校验的事实标准了,比如在Web框架GIN中,就是默认使用它。表单校验的作用,就是对输入的数据 进行合法判断,如果是不合法的,那么就输出错误。比如:

package main

import (
        "log"

        "github.com/go-playground/validator/v10"
)

type MyStruct struct {
        FirstName string `json:"firstname" validate:"required"`
}

func main() {
        v := validator.New()

        s := MyStruct{"blabla"}
        err := v.Struct(s)
        log.Printf("%+v", err)

        s2 := MyStruct{}
        err = v.Struct(s2)
        log.Printf("%+v", err)
}

执行结果为:

$ go run main.go
2020/04/10 21:28:41 <nil>
2020/04/10 21:28:41 Key: 'MyStruct.FirstName' Error:Field validation for 'FirstName' failed on the 'required' tag

而validator基本的用法,其实也就和上面的类似,只不过,除了 v.Struct 之外,还有好几个:

  • func (v *Validate) Struct(s interface{}) error 接收的参数为一个struct
  • func (v *Validate) StructExcept(s interface{}, fields ...string) error 校验struct中的选项,不过除了fields里所给的字段
  • func (v *Validate) StructFiltered(s interface{}, fn FilterFunc) error 接收一个struct和一个函数,这个函数的返回值为bool,决定是否跳过该选项
  • func (v *Validate) StructPartial(s interface{}, fields ...string) error 接收一个struct和fields,仅校验在fields里的值
  • func (v *Validate) Var(field interface{}, tag string) error 接收一个变量和一个tag的值,比如 validate.Var(i, "gt=1,lt=10")
  • func (v *Validate) VarWithValue(field interface{}, other interface{}, tag string) error 将两个变量进行对比,比如 validate.VarWithValue(s1, s2, "eqcsfield")

上述方法均有另外一种形式,就是带上context的那种,函数名字就是上述函数名,最后加一个 Ctx

了解了这些之后,我们还需要了解的一个东西就是,在Golang中,我们使用 struct tag 来定义表单合法的值。比如如果我们希望某个 字段是邮件,那么可以这样定义:

type MyStruct struct {
    Email string `validate:"email"`
}

如果有多个校验条件,可以用英文逗号 , 来进行连接,他们是 AND 的关系,如果想要 OR 的关系,那么使用 |,比如:

package main

import (
        "log"

        "github.com/go-playground/validator/v10"
)

type MyStruct struct {
        Age int `json:"age" validate:"lt=10|gt=20"`
}

func main() {
        v := validator.New()

        s := MyStruct{15}
        err := v.Struct(s)
        log.Printf("%+v", err)

        s2 := MyStruct{9}
        err = v.Struct(s2)
        log.Printf("%+v", err)
}

接着我们来看看常见的校验写法:

  • email 邮件
  • url 链接
  • json JSON
  • file 文件路径
  • base64 Base64
  • containsany=!@#?contains=@containsrune=@ 都表示包含
  • excludes=@excludesall=!@#?excludesrune=@ 都表示不包含
  • startswith=hello 和 endswith=goodbye 表示字符串的起始和结束是否等于值
  • latitude 和 longitude 分别表示是否是纬度和经度
  • ipipv4ipv6 分别表示对应的IP地址类型
  • datetime=2006-01-02 表示是否是这种格式的日期字符串
  • uuiduuid3uuid4uuid5 表示是否是对应的UUID类型
  • lowercase 和 uppercase 表示是否是对应的小写或者大写
  • gtlt 分别是大于和小于,eq 表示等于,如果是大于等于,那么是 gte,小于等于则是 lte
  • oneof='red green' 'blue yellow'oneof=5 7 9 表示是其中一个值
  • minmax 表示其值是否满足此表达式
  • required 表示此项是必填的,不能为0值
  • - 忽略此属性,即不校验此属性

这就是常见的标签的用法和意思,快用起来吧!

回帖
  • 消灭零回复
相关主题
golang实现内存池 go语言字节池byte pool实现代码 0
golang网络编程之基于TCP协议实现长连接 golang心跳检测 0
golang类型断言type的使用 0
golang依赖包管理 mod使用教程 0
golang表单验证库validator 0
如何使用Go语言实现一个简单的异步任务框架呢?生产者消费者模型 0
golang 网络编程设置keepAlive空闲多长时间开始探测、 探测总次数 0
golang网络编程之TCP编程详解 0
go语言利用ioutil.ReadAll读取TCP socket所有数据 0
golang利用io.copy和bytes.Buffer读取TCP socket所有数据 0
golang读取所有socket数据的方式一 0
围绕Handler接口的方法ServeHTTP,可以轻松的写出go中的中间件 0
golang语言错误处理方式check函数,把错误转化为panic 0
golang cannot find module providing package 0
golang语言错误处理errors包使用详解 0
golang基于通道channel实现一个通用连接池 pool 0
golang数据类型之map结构详解 0
golang socket关闭读导致 wsarecv: An existing connection was forcibly closed by the remote host 0
windows配置golang的环境变量 gopath配置学习go语言第一天 0
golang应该是可以代替对使用c++存在误解的人吧,代替语言是不可能的 0
相关主题
QListWidget滚动的时候显示不完整 滚动条模式导致的哦 0
Qt设置顶层面板背景透明Qt::WA_TranslucentBackground 隐藏边框Qt::FramelessWindowHint 0
QMenu和QMenuBar样式表大全 qss 0
QT定时器startTimer和timerEvent事件 每隔interval 毫秒就会启动一次 0
C语言内存分配函数malloc和calloc的区别 0
QCheckBox的QSS样式表总结 0
Qt通过qRegisterMetaType注册自定义数据类型 0
QListwidget触发2次itemClicked事件 0
打印机USB驱动开发之实现打印服务器 0
Qt利用QLabel组件来显示图片 0
TableView自定义代理QStyledItemDelegate实现ComboBox 0
Qt利用QGraphicsView类实现图片放大缩小平移显示 0
Qt实现非阻塞延迟方法sleep 0
海康相机SDK的C++对应的接口 0
Qt实现webdav客户端功能支持https协议的webdav客户端 0
CHKDSK解决 移动硬盘只能看见盘符其它信息都看不见另外双击也打不开 0
gogs一直报errror:dial tcp xxx.xxx.xxx.xxx 宿主机的ip 0
索鸟快传2.1.2发布 0
索鸟快传2.1.1发布 0
Qt操作windows注册表的方法 bat从注册表中将键值删除 0