日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

GoFrame實現(xiàn)順序性校驗示例詳解_Golang

作者:王中陽Go ? 更新時間: 2022-08-22 編程語言

引言

在上一篇文章中 GoFrame數(shù)據(jù)校驗之校驗結(jié)果 | Error接口對象 ,關(guān)于順序與非順序性校驗沒有做充分的介紹。

這篇文章填上之前留的坑,我們以map校驗舉例:

基本介紹

我們通過上一篇文章了解到:Error接口對象的方法,其順序性只有使用順序校驗規(guī)則時有效,否則返回的結(jié)果是隨機的。

即使我們使用FirstItem,?FirstString()等其他方法獲取校驗結(jié)果也是一樣,返回的校驗結(jié)果不固定。

無序的原因

因為校驗的規(guī)則我們傳遞的是map類型,而golangmap類型并不具有有序性(底層數(shù)據(jù)結(jié)構(gòu)是hashmap),因此校驗的結(jié)果和規(guī)則一樣是隨機的,同一個校驗結(jié)果的同一個校驗方法多次獲取結(jié)果值返回的可能也不一樣了。

順序校驗

我們來舉個栗子:

校驗結(jié)果中如果不滿足required那么返回對應(yīng)的錯誤信息,否則才是后續(xù)的校驗錯誤信息;

也就是說,返回的錯誤信息應(yīng)當(dāng)和我設(shè)定規(guī)則時的順序一致。

代碼示例如下:

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#賬號不能為空|賬號長度應(yīng)當(dāng)在{min}到{max}之間",
			"password@required|length:6,16|same:password2#密碼不能為空|密碼長度應(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:賬號長度應(yīng)當(dāng)在6到16之間 required:賬號不能為空]
passport map[length:賬號長度應(yīng)當(dāng)在6到16之間 required:賬號不能為空]
賬號不能為空

可以看到,上述的執(zhí)行結(jié)果是滿足順序性的。

我們來總結(jié)一下:我們想要校驗結(jié)果滿足順序性,只需要將rules參數(shù)的類型設(shè)置為[]string,按照一定的規(guī)則設(shè)定即可,并且msgs參數(shù)既可以定義到rules參數(shù)中,也可以分開傳入(使用第三個參數(shù))。

rules的這種滿足順序性校驗結(jié)果返回的規(guī)則,我們稱之為gvalid tag

下一篇文章為大家剖析gvalid tag的知識點。

總結(jié)

通過這篇文章,我們已經(jīng)拿到了實現(xiàn)順序性校驗的金鑰匙:只需要將rules參數(shù)的類型設(shè)置為[]string,按照一定的規(guī)則設(shè)定即可,并且msgs參數(shù)既可以定義到rules參數(shù)中,也可以分開傳入。

原文鏈接:https://juejin.cn/post/7113360526410776583

欄目分類
最近更新