Go语言参数校验(go-playground / validator)——自定义校验(自定义验证规则)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-24 06:21   11   0

go-playground / validator提供了以下校验:

TagDescription
eqcsfieldField Equals Another Field (relative)
eqfieldField Equals Another Field
fieldcontainsNOT DOCUMENTED IN doc.go
fieldexcludesNOT DOCUMENTED IN doc.go
gtcsfieldField Greater Than Another Relative Field
gtecsfieldField Greater Than or Equal To Another Relative Field
gtefieldField Greater Than or Equal To Another Field
gtfieldField Greater Than Another Field
ltcsfieldLess Than Another Relative Field
ltecsfieldLess Than or Equal To Another Relative Field
ltefieldLess Than or Equal To Another Field
ltfieldLess Than Another Field
necsfieldField Does Not Equal Another Field (relative)
nefieldField Does Not Equal Another Field

Network:

TagDescription
cidrClassless Inter-Domain Routing CIDR
cidrv4Classless Inter-Domain Routing CIDRv4
cidrv6Classless Inter-Domain Routing CIDRv6
datauriData URL
fqdnFull Qualified Domain Name (FQDN)
hostnameHostname RFC 952
hostname_portHostPort
hostname_rfc1123Hostname RFC 1123
ipInternet Protocol Address IP
ip4_addrInternet Protocol Address IPv4
ip6_addrInternet Protocol Address IPv6
ip_addrInternet Protocol Address IP
ipv4Internet Protocol Address IPv4
ipv6Internet Protocol Address IPv6
macMedia Access Control Address MAC
tcp4_addrTransmission Control Protocol Address TCPv4
tcp6_addrTransmission Control Protocol Address TCPv6
tcp_addrTransmission Control Protocol Address TCP
udp4_addrUser Datagram Protocol Address UDPv4
udp6_addrUser Datagram Protocol Address UDPv6
udp_addrUser Datagram Protocol Address UDP
unix_addrUnix domain socket end point Address
uriURI String
urlURL String
url_encodedURL Encoded
urn_rfc2141Urn RFC 2141 String

Strings:

TagDescription
alphaAlpha Only
alphanumAlphanumeric
alphanumunicodeAlphanumeric Unicode
alphaunicodeAlpha Unicode
asciiASCII
containsContains
containsanyContains Any
containsruneContains Rune
lowercaseLowercase
multibyteMulti-Byte Characters
numberNOT DOCUMENTED IN doc.go
numericNumeric
printasciiPrintable ASCII
startswithStarts With
uppercaseUppercase

Format:

TagDescription
base64Base64 String
base64urlBase64URL String
btc_addrBitcoin Address
btc_addr_bech32Bitcoin Bech32 Address (segwit)
datetimeDatetime
emailE-mail String
eth_addrEthereum Address
hexadecimalHexadecimal String
hexcolorHexcolor String
hslHSL String
hslaHSLA String
htmlHTML Tags
html_encodedHTML Encoded
isbnInternational Standard Book Number
isbn10International Standard Book Number 10
isbn13International Standard Book Number 13
jsonJSON
latitudeLatitude
longitudeLongitude
rgbRGB String
rgbaRGBA String
ssnSocial Security Number SSN
uuidUniversally Unique Identifier UUID
uuid3Universally Unique Identifier UUID v3
uuid3_rfc4122Universally Unique Identifier UUID v3 RFC4122
uuid4Universally Unique Identifier UUID v4
uuid4_rfc4122Universally Unique Identifier UUID v4 RFC4122
uuid5Universally Unique Identifier UUID v5
uuid5_rfc4122Universally Unique Identifier UUID v5 RFC4122
uuid_rfc4122Universally Unique Identifier UUID RFC4122

Comparisons:

TagDescription
eqEquals
gtGreater than
gteGreater than or equal
ltLess Than
lteLess Than or Equal
neNot Equal

除此之前,还可以自定义校验规则,示例代码如下:

package main

import (
 "fmt"
 "github.com/go-playground/validator"
 "github.com/satori/go.uuid"
 "unicode/utf8"
)

type UserInfo struct {
 Id   string `validate:"uuid"`          //UUID 类型
 Name string `validate:"checkName"`     //自定义校验
 Age  uint8  `validate:"min=0,max=130"` //  0<=Age<=130
 
}

//自定义校验函数
func checkName(f validator.FieldLevel) bool { // FieldLevel contains all the information and helper functions to validate a field
 count := utf8.RuneCountInString(f.Field().String()) //通过utf8编码,获取字符串长度
 if count >= 2 && count <= 12 {
  return true
 }
 return false
}
func main() {
 validate := validator.New()
 //自定义函数checkName与 struct tag 关联起来
 err := validate.RegisterValidation("checkName", checkName)
 if err!=nil {
  fmt.Println("注册失败!")
  return
 }
 //UUID引用:satori/go.uuid;添加方法:go get github.com/satori/go.uuid
 uuid := uuid.Must(uuid.NewV1()) //通过satori/go.uuid,快速生成UUID
 fmt.Println("UUID:",uuid)
 user := UserInfo{
  Id:   uuid.String(),
  Name: "jiangzhou",
  Age:  223,
 }
 err=validate.Struct(user)
 if err!=nil {
  for _,e:=range err.(validator.ValidationErrors){
   fmt.Println("错误字段:",e.Field())
   fmt.Println("错误值:",e.Value())
   fmt.Println("错误tag:",e.Tag())
  }
  return
 }
 fmt.Println("校验成功")
}

运行效果:

了解更多Go语言知识https://study.163.com/course/introduction/1210620804.htm

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP