GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解
引言
在上一篇文章中 GoFrame數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果 | Error接口對(duì)象 ,關(guān)于順序與非順序性校驗(yàn)沒(méi)有做充分的介紹。
這篇文章填上之前留的坑,我們以map校驗(yàn)舉例:
基本介紹
我們通過(guò)上一篇文章了解到:Error接口對(duì)象的方法,其順序性只有使用順序校驗(yàn)規(guī)則時(shí)有效,否則返回的結(jié)果是隨機(jī)的。
即使我們使用FirstItem
, FirstString()
等其他方法獲取校驗(yàn)結(jié)果也是一樣,返回的校驗(yàn)結(jié)果不固定。
無(wú)序的原因
因?yàn)樾r?yàn)的規(guī)則我們傳遞的是map
類型,而golang
的map
類型并不具有有序性(底層數(shù)據(jù)結(jié)構(gòu)是hashmap),因此校驗(yàn)的結(jié)果和規(guī)則一樣是隨機(jī)的,同一個(gè)校驗(yàn)結(jié)果的同一個(gè)校驗(yàn)方法多次獲取結(jié)果值返回的可能也不一樣了。
順序校驗(yàn)
我們來(lái)舉個(gè)栗子:
校驗(yàn)結(jié)果中如果不滿足required
那么返回對(duì)應(yīng)的錯(cuò)誤信息,否則才是后續(xù)的校驗(yàn)錯(cuò)誤信息;
也就是說(shuō),返回的錯(cuò)誤信息應(yīng)當(dāng)和我設(shè)定規(guī)則時(shí)的順序一致。
代碼示例如下:
package main import ( "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" ) func main() { var ( ctx = gctx.New() params = map[string]interface{}{ "passport": "", "password": "wangzhongyang", "password2": "wangyang", } rules = []string{ "passport@required|length:6,16#賬號(hào)不能為空|賬號(hào)長(zhǎng)度應(yīng)當(dāng)在{min}到{max}之間", "password@required|length:6,16|same:password2#密碼不能為空|密碼長(zhǎng)度應(yīng)當(dāng)在{min}到{max}之間|兩次密碼輸入不相等", "password2@required|length:6,16#", } ) err := g.Validator().Rules(rules).Data(params).Run(ctx) if err != nil { fmt.Println(err.Map()) fmt.Println(err.FirstItem()) fmt.Println(err.FirstError()) } }
執(zhí)行后,終端輸出:
map[length:賬號(hào)長(zhǎng)度應(yīng)當(dāng)在6到16之間 required:賬號(hào)不能為空]
passport map[length:賬號(hào)長(zhǎng)度應(yīng)當(dāng)在6到16之間 required:賬號(hào)不能為空]
賬號(hào)不能為空
可以看到,上述的執(zhí)行結(jié)果是滿足順序性的。
我們來(lái)總結(jié)一下:我們想要校驗(yàn)結(jié)果滿足順序性,只需要將rules
參數(shù)的類型設(shè)置為[]string
,按照一定的規(guī)則設(shè)定即可,并且msgs
參數(shù)既可以定義到rules
參數(shù)中,也可以分開(kāi)傳入(使用第三個(gè)參數(shù))。
rules
的這種滿足順序性校驗(yàn)結(jié)果返回的規(guī)則,我們稱之為gvalid tag
。
下一篇文章為大家剖析gvalid tag
的知識(shí)點(diǎn)。
總結(jié)
通過(guò)這篇文章,我們已經(jīng)拿到了實(shí)現(xiàn)順序性校驗(yàn)的金鑰匙:只需要將rules
參數(shù)的類型設(shè)置為[]string
,按照一定的規(guī)則設(shè)定即可,并且msgs
參數(shù)既可以定義到rules
參數(shù)中,也可以分開(kāi)傳入。
以上就是GoFrame實(shí)現(xiàn)順序性校驗(yàn)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于GoFrame順序性校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- bug解決Failed_to_execute_goal_org.springframework
- Django Rest Framework框架構(gòu)建復(fù)雜API技能詳解
- Android FrameWork之Zygote啟動(dòng)示例詳解
- 優(yōu)雅使用GoFrame共享變量Context示例詳解
- GoFrame錯(cuò)誤處理常用方法及錯(cuò)誤碼使用示例
- GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對(duì)象
- GoFrame基于性能測(cè)試得知grpool使用場(chǎng)景
- goframe重寫(xiě)FastAdmin后端實(shí)現(xiàn)實(shí)例詳解
相關(guān)文章
分析Go錯(cuò)誤處理優(yōu)化go?recover機(jī)制缺陷
這篇文章主要為大家介紹了分析Go錯(cuò)誤處理優(yōu)化go?recover機(jī)制缺陷示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Go語(yǔ)言Elasticsearch數(shù)據(jù)清理工具思路詳解
這篇文章主要介紹了Go語(yǔ)言Elasticsearch數(shù)據(jù)清理工具思路詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10go-zero熔斷機(jī)制組件Breaker接口定義使用解析
這篇文章主要為大家介紹了go-zero熔斷機(jī)制組件Breaker接口定義使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Golang使用Zookeeper實(shí)現(xiàn)分布式鎖
分布式鎖是一種在分布式系統(tǒng)中用于控制并發(fā)訪問(wèn)的機(jī)制,ZooKeeper?和?Redis?都是常用的實(shí)現(xiàn)分布式鎖的工具,本文就來(lái)使用Zookeeper實(shí)現(xiàn)分布式鎖,希望對(duì)大家有所幫助2024-02-02golang提示dial?tcp?172?.217.163.49:443:?connectex:?A?con
這篇文章主要為大家介紹了golang提示dial?tcp?172?.217.163.49:443:?connectex:?A?connection?attempt?failed解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07golang數(shù)組和切片作為參數(shù)和返回值的實(shí)現(xiàn)
本文主要介紹了golang數(shù)組和切片作為參數(shù)和返回值的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02