Go的gin參數(shù)校驗(yàn)中的validator庫詳解
使用 validator 以后,只需要在定義結(jié)構(gòu)體時(shí)使用 binding 或 validate tag標(biāo)識(shí)相關(guān)校驗(yàn)規(guī)則,就可以進(jìn)行參數(shù)校驗(yàn)了,而不用自己單獨(dú)去寫常見的校驗(yàn)規(guī)則。
main.go
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
"github.com/go-playground/locales/zh_Hans_CN"
unTrans "github.com/go-playground/universal-translator"
zhTrans "github.com/go-playground/validator/v10/translations/zh"
)
type User struct {
Username string `validate:"min=6,max=10,contains=ook,startswith=He"`
Age uint8 `validate:"gte=1,lte=10"`
Sex string `validate:"oneof=female male"`
Email string `validate:"email"`
}
func main() {
validate := validator.New()
//user := User{Username: "Heooking", Age: 6, Sex: "male", Email: "test@qq.com"}
user := User{Username: "Looking", Age: 26, Sex: "male", Email: "qq.com"}
err := validate.Struct(user)
// 默認(rèn)英文提示
if err != nil {
fmt.Println(err)
//Key: 'User.Username' Error:Field validation for 'Username' failed on the 'startswith' tag
//Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
//Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag
}
fmt.Println()
// 中文錯(cuò)誤提示
uni := unTrans.New(zh_Hans_CN.New())
trans, _ := uni.GetTranslator("zh_Hans_CN")
zhTrans.RegisterDefaultTranslations(validate, trans)
if err != nil {
for _, v := range err.(validator.ValidationErrors) {
fmt.Println(v.Translate(trans))
//Username必須以文本'He'開頭
//Age必須小于或等于10
//Email必須是一個(gè)有效的郵箱
}
}
}go.mod
module test go 1.17 require ( github.com/go-playground/validator/v10 v10.15.0 ) require ( github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect golang.org/x/crypto v0.7.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/sys v0.6.0 // indirect )
常用約束如下:
字符串約束
- excludesall:不包含參數(shù)中任意的 UNICODE 字符,例如excludesall=ab;
- excludesrune:不包含參數(shù)表示的 rune 字符,excludesrune=asong;
- startswith:以參數(shù)子串為前綴,例如startswith=hi;
- endswith:以參數(shù)子串為后綴,例如endswith=bye。
- contains=:包含參數(shù)子串,例如contains=email;
- containsany:包含參數(shù)中任意的 UNICODE 字符,例如containsany=ab;
- containsrune:包含參數(shù)表示的 rune 字符,例如`containsrune=asong;
- excludes:不包含參數(shù)子串,例如excludes=email;
范圍約束
范圍約束的字段類型分為三種:
- 對(duì)于數(shù)值,我們則可以約束其值
- 對(duì)于切片、數(shù)組和map,我們則可以約束其長度
- 對(duì)于字符串,我們則可以約束其長度
常用 tag 介紹:
- ne:不等于參數(shù)值,例如 ne=5;
- gt:大于參數(shù)值,例如 gt=5;
- gte:大于等于參數(shù)值,例如 gte=50;
- lt:小于參數(shù)值,例如 lt=50;
- lte:小于等于參數(shù)值,例如 lte=50;
- oneof:只能是列舉出的值其中一個(gè),這些值必須是數(shù)值或字符串,以空格分隔,如果字符串中有空格,將字符串用單引號(hào)包圍,例如 oneof=male female。
- eq:等于參數(shù)值,注意與 len不同。對(duì)于字符串, eq約束字符串本身的值,而 len約束字符串長度。例如 eq=10;
- len:等于參數(shù)值,例如 len=10;
- max:小于等于參數(shù)值,例如 max=10;
- min:大于等于參數(shù)值,例如 min=10
- Fields約束
- eqfield:定義字段間的相等約束,用于約束同一結(jié)構(gòu)體中的字段。例如: eqfield=Password
- eqcsfield:約束統(tǒng)一結(jié)構(gòu)體中字段等于另一個(gè)字段(相對(duì)),確認(rèn)密碼時(shí)可以使用,例如: eqfiel=ConfirmPassword
- nefield:用來約束兩個(gè)字段是否相同,確認(rèn)兩種顏色是否一致時(shí)可以使用,例如: nefield=Color1
- necsfield:約束兩個(gè)字段是否相同(相對(duì))
常用約束
- unique:指定唯一性約束,不同類型處理不同:
對(duì)于map,unique約束沒有重復(fù)的值
對(duì)于數(shù)組和切片,unique沒有重復(fù)的值
對(duì)于元素類型為結(jié)構(gòu)體的碎片,unique約束結(jié)構(gòu)體對(duì)象的某個(gè)字段不重復(fù),使用 unique=field指定字段名
- email:使用email來限制字段必須是郵件形式,直接寫eamil即可,無需加任何指定。
- omitempty:字段未設(shè)置,則忽略
- -:跳過該字段,不檢驗(yàn);
- |:使用多個(gè)約束,只需要滿足其中一個(gè),例如rgb|rgba;
- required:字段必須設(shè)置,不能為默認(rèn)值;
到此這篇關(guān)于Go的gin參數(shù)校驗(yàn)之validator庫的文章就介紹到這了,更多相關(guān)Go validator庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例
這篇文章主要為大家介紹了golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
輕松入門:使用Golang開發(fā)跨平臺(tái)GUI應(yīng)用
Golang是一種強(qiáng)大的編程語言,它的并發(fā)性和高性能使其成為開發(fā)GUI桌面應(yīng)用的理想選擇,Golang提供了豐富的標(biāo)準(zhǔn)庫和第三方庫,可以輕松地創(chuàng)建跨平臺(tái)的GUI應(yīng)用程序,通過使用Golang的GUI庫,開發(fā)人員可以快速構(gòu)建具有豐富用戶界面和交互功能的應(yīng)用程序,需要的朋友可以參考下2023-10-10
Go語言中配置實(shí)現(xiàn)Logger日志的功能詳解
當(dāng)我們正式開發(fā)go程序的時(shí)候,就會(huì)發(fā)現(xiàn)記錄程序日志已經(jīng)不是fmt.print這么簡單了,所以我們需要專門的去存儲(chǔ)日志文件,這篇文章主要介紹了在Go語言中配置實(shí)現(xiàn)Logger日志的功能,感興趣的同學(xué)可以參考下文2023-05-05
Golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解
說實(shí)話,golang的時(shí)間轉(zhuǎn)化還是很麻煩的,最起碼比php麻煩很多,下面這篇文章主要給大家介紹了關(guān)于golang時(shí)間/時(shí)間戳的獲取與轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
go 對(duì)象池化組件 bytebufferpool使用詳解
這篇文章主要為大家介紹了go 對(duì)象池化組件 bytebufferpool使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
golang NewRequest/gorequest實(shí)現(xiàn)http請(qǐng)求的示例代碼
本文主要介紹了golang NewRequest/gorequest實(shí)現(xiàn)http請(qǐng)求的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
淺析Go語言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的
在?Go?中,map?是一種用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),它提供了一種快速查找和訪問數(shù)據(jù)的方式,下面我們就來看看Go語言中是如何實(shí)現(xiàn)map數(shù)據(jù)結(jié)構(gòu)的吧2024-03-03
Golang開發(fā)動(dòng)態(tài)庫的實(shí)現(xiàn)
這篇文章主要介紹了Golang開發(fā)動(dòng)態(tài)庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Golang加權(quán)輪詢負(fù)載均衡的實(shí)現(xiàn)
負(fù)載均衡器在向后端服務(wù)分發(fā)流量負(fù)載時(shí)可以使用幾種策略。本文主要介紹了Golang加權(quán)輪詢負(fù)載均衡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

