婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang常用庫之字段參數驗證庫-validator使用詳解

golang常用庫之字段參數驗證庫-validator使用詳解

熱門標簽:智能電銷機器人營銷 廣東語音外呼系統供應商 賺地圖標注的錢犯法嗎 澳門防封電銷卡 烏魯木齊人工電銷機器人系統 地圖標注測試 濮陽自動外呼系統代理 長沙ai機器人電銷 福州鐵通自動外呼系統

golang常用庫:gorilla/mux-http路由庫使用
golang常用庫:配置文件解析庫-viper使用
golang常用庫:操作數據庫的orm框架-gorm基本使用
golang常用庫:字段參數驗證庫-validator使用

一、背景

在平常開發中,特別是在web應用開發中,為了驗證輸入字段的合法性,都會做一些驗證操作。比如對用戶提交的表單字段進行驗證,或者對請求的API接口字段進行驗證,驗證字段的合法性,保證輸入字段值的安全,防止用戶的惡意請求。

一般的做法是用正則表達式,一個字段一個字段的進行驗證。一個一個字段驗證的話,寫起來比較繁瑣。那有沒更好的方法,進行字段的合法性驗證?有, 這就是下面要介紹的 validator 這個驗證組件。

代碼地址:
https://github.com/go-playground/validator

文檔地址:
https://github.com/go-playground/validator/blob/master/README.md

二、功能介紹

這個驗證包 github.com/go-playground/validator 驗證功能非常多。

標記之間特殊符號說明

  • 逗號( , ):把多個驗證標記隔開。注意:隔開逗號之間不能有空格, validate:"lt=0,gt=100",逗號那里不能有空格,否則panic
  • 橫線( - ):跳過該字段不驗證
  • 豎線( | ):使用多個驗證標記,但是只需滿足其中一個即可
  • required:表示該字段值必輸設置,且不能為默認值
  • omitempty:如果字段未設置,則忽略它

范圍比較驗證

doc: https://github.com/go-playground/validator/blob/master/README.md#comparisons

范圍驗證: 切片、數組和map、字符串,驗證其長度;數值,驗證大小范圍

  • lte:小于等于參數值,validate:"lte=3" (小于等于3)
  • gte:大于等于參數值,validate:"lte=0,gte=120" (大于等于0小于等于120)
  • lt:小于參數值,validate:"lt=3" (小于3)
  • gt:大于參數值,validate:"lt=0,gt=120" (大于0小于120)
  • len:等于參數值,validate:"len=2"
  • max:大于等于參數值,validate:"max=2" (大于等于2)
  • min:小于等于參數值,validate:"min=2,max=10" (大于等于2小于等于10)
  • ne:不等于,validate:"ne=2" (不等于2)
  • oneof:只能是列舉出的值其中一個,這些值必須是數值或字符串,以空格分隔,如果字符串中有空格,將字符串用單引號包圍,validate:"oneof=red green"

例子:

type User struct {
 Name string `json:"name" validate:"min=0,max=35"`
 Age unit8 `json:"age" validate:"lte=0,gte=90"`
}

更多功能請參看文檔 validator comparisons doc

字符串驗證

doc: https://github.com/go-playground/validator/blob/master/README.md#strings

  • contains:包含參數子串,validate:"contains=tom" (字段的字符串值包含tom)
  • excludes:包含參數子串,validate:"excludes=tom" (字段的字符串值不包含tom)
  • startswith:以參數子串為前綴,validate:"startswith=golang"
  • endswith:以參數子串為后綴,validate:"startswith=world"

例子:

type User struct { 
 Name string `validate:"contains=tom"` 
 Age int `validate:"min=1"`
}

更多功能請參看文檔 validator strings doc

字段驗證

doc: https://github.com/go-playground/validator/blob/master/README.md#fields

eqcsfield:跨不同結構體字段驗證,比如說 Struct1 Filed1,與結構體Struct2 Field2相等,

type Struct1 struct {
 Field1 string `validate:eqcsfield=Struct2.Field2`
 Struct2 struct {
 Field2 string 
 }
}
  • necsfield:跨不同結構體字段不相等
  • eqfield:同一結構體字段驗證相等,最常見的就是輸入2次密碼驗證
type User struct { 
 Name string `validate:"lte=4"` 
 Age int `validate:"min=20"` 
 Password string `validate:"min=10"`
 Password2 string `validate:"eqfield=Password"`
}

nefield:同一結構體字段驗證不相等

type User struct {
 Name string `validate:"lte=4"` 
 Age int `validate:"min=20"` 
 Password string `validate:"min=10,nefield=Name"`
}
  • gtefield:大于等于同一結構體字段,validate:"gtefiled=Field2"
  • ltefield:小于等于同一結構體字段

更多功能請參看文檔:validator Fields DOC

網絡驗證

doc: https://github.com/go-playground/validator/blob/master/README.md#network

  • ip:字段值是否包含有效的IP地址,validate:"ip"
  • ipv4:字段值是否包含有效的ipv4地址,validate:"ipv4"
  • ipv6:字段值是否包含有效的ipv6地址,validate:"ipv6"
  • uri:字段值是否包含有效的uri,validate:"uri"
  • url:字段值是否包含有效的uri,validate:"url"

更多功能請參看文檔:validator network DOC

Format

doc: https://github.com/go-playground/validator/blob/master/README.md#format

base64:字段值是否包含有效的base64值

更多功能請參看文檔 validator strings doc

其他

請參看文檔: https://github.com/go-playground/validator/blob/master/README.md#other

三、安裝

go get:

go get github.com/go-playground/validator/v10

在文件中引用validator包:

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

四、validator使用

文檔:https://github.com/go-playground/validator/blob/master/README.md#examples

例子1:驗證單個字段變量值

validation1.go

package main

import (
	"fmt"

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

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

	var boolTest bool
	err := validate.Var(boolTest, "required")
	if err != nil {
		fmt.Println(err)
	}
	var stringTest string = ""
	err = validate.Var(stringTest, "required")
	if err != nil {
		fmt.Println(err)
	}

	var emailTest string = "test@126.com"
	err = validate.Var(emailTest, "email")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("success") // 輸出: success。 說明驗證成功
	}

	emailTest2 := "test.126.com"
	errs := validate.Var(emailTest2, "required,email")
	if errs != nil {
		fmt.Println(errs) // 輸出: Key: "" Error:Field validation for "" failed on the "email" tag。驗證失敗
	}

	fmt.Println("\r\nEnd!!")
 
}

運行輸出:

go run simple1.go
Key: '' Error:Field validation for '' failed on the 'required' tag
Key: '' Error:Field validation for '' failed on the 'required' tag
success
Key: '' Error:Field validation for '' failed on the 'email' tag

End!!

例子2:驗證結構體struct

from:struct validate

validation_struct.go,這個程序還列出了效驗出錯字段的一些信息,

package main

import (
	"fmt"

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

type User struct {
	FirstName string `validate:"required"`
	LastName string `validate:"required"`
	Age uint8 `validate:"gte=0,lte=130"`
	Email string `validate:"required,email"`
	Addresses []*Address `validate:"required,dive,required"`
}

type Address struct {
	Street string `validate:"required"`
	City string `validate:"required"`
	Planet string `validate:"required"`
	Phone string `validate:"required"`
}

func main() {
	address := Address{
		Street: "Eavesdown Docks",
		Planet: "Persphone",
		Phone: "none",
	}

	user := User{
		FirstName: "Badger",
		LastName: "Smith",
		Age: 135,
		Email: "Badger.Smith@gmail.com",
		Addresses: []*Address{address},
	}

	validate := validator.New()
	err := validate.Struct(user)
	if err != nil {
		fmt.Println("=== error msg ====")
		fmt.Println(err)

		if _, ok := err.(*validator.InvalidValidationError); ok {
			fmt.Println(err)
			return
		}

		fmt.Println("\r\n=========== error field info ====================")
		for _, err := range err.(validator.ValidationErrors) {
 // 列出效驗出錯字段的信息
			fmt.Println("Namespace: ", err.Namespace())
			fmt.Println("Fild: ", err.Field())
			fmt.Println("StructNamespace: ", err.StructNamespace())
			fmt.Println("StructField: ", err.StructField())
			fmt.Println("Tag: ", err.Tag())
			fmt.Println("ActualTag: ", err.ActualTag())
			fmt.Println("Kind: ", err.Kind())
			fmt.Println("Type: ", err.Type())
			fmt.Println("Value: ", err.Value())
			fmt.Println("Param: ", err.Param())
			fmt.Println()
		}

		// from here you can create your own error messages in whatever language you wish
		return
	}
}

運行 輸出:

$ go run validation_struct.go
=== error msg ====
Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
Key: 'User.Addresses[0].City' Error:Field validation for 'City' failed on the 'required' tag

=========== error field info ====================
Namespace: User.Age
Fild: Age
StructNamespace: User.Age
StructField: Age
Tag: lte
ActualTag: lte
Kind: uint8
Type: uint8
Value: 135
Param: 130

Namespace: User.Addresses[0].City
Fild: City
StructNamespace: User.Addresses[0].City
StructField: City
Tag: required
ActualTag: required
Kind: string
Type: string
Value:
Param:

還可以給字段加一些其他tag信息,方面form,json的解析,如下:

type User struct {
 FirstName string `form:"firstname" json:"firstname" validate:"required"`
	LastName string `form:"lastname" json:"lastname" validate:"required"`
	Age uint8 ` form:"age" json:"age"validate:"gte=0,lte=130"`
	Email string ` form:"email" json:"email" validate:"required,email"`
}

用戶自定義函數驗證

用戶自定義函數驗證字段是否合法,效驗是否正確。

例子3: 通過字段tag自定義函數

validate.RegisterValidation

customer_tag.go:

package main

import (
	"fmt"

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

type User struct {
	Name string `form:"name" json:"name" validate:"required,CustomerValidation"` //注意:required和CustomerValidation之間不能有空格,否則panic。CustomerValidation:自定義tag-函數標簽
	Age uint8 ` form:"age" json:"age" validate:"gte=0,lte=80"` //注意:gte=0和lte=80之間不能有空格,否則panic
}

var validate *validator.Validate

func main() {
	validate = validator.New()
	validate.RegisterValidation("CustomerValidation", CustomerValidationFunc) //注冊自定義函數,前一個參數是struct里tag自定義,后一個參數是自定義的函數

	user := User{
		Name: "jimmy",
		Age: 86,
	}

	fmt.Println("first value: ", user)
	err := validate.Struct(user)
	if err != nil {
		fmt.Printf("Err(s):\n%+v\n", err)
	}

	user.Name = "tom"
	user.Age = 29
	fmt.Println("second value: ", user)
	err = validate.Struct(user)
	if err != nil {
		fmt.Printf("Err(s):\n%+v\n", err)
	}
}

// 自定義函數
func CustomerValidationFunc(f1 validator.FieldLevel) bool {
 // f1 包含了字段相關信息
 // f1.Field() 獲取當前字段信息
 // f1.Param() 獲取tag對應的參數
 // f1.FieldName() 獲取字段名稱
 
	return f1.Field().String() == "jimmy"
}

運行輸出:

$ go run customer.go
first value: {jimmy 86}
Err(s):
Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag
second value: {tom 29}
Err(s):
Key: 'User.Name' Error:Field validation for 'Name' failed on the 'CustomerValidation' tag

**注意

上面代碼user struct定義中 ,validate里的required和CustomerValidation之間不能有空格,否則運行時報panic錯誤:panic: Undefined validation function ' CustomerValidation' on field 'Name'

例子4:自定義函數-直接注冊函數1

不通過字段tag自定義函數,直接注冊函數。

RegisterStructValidation

https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go

customer1.go

package main

import (
	"fmt"

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

type User struct {
	FirstName string `json:firstname`
	LastName string `json:lastname`
	Age uint8 `validate:"gte=0,lte=130"`
	Email string `validate:"required,email"`
	FavouriteColor string `validate:"hexcolor|rgb|rgba"`
}

var validate *validator.Validate

func main() {
	validate = validator.New()

	validate.RegisterStructValidation(UserStructLevelValidation, User{})

	user := User{
		FirstName: "",
		LastName: "",
		Age: 30,
		Email: "TestFunc@126.com",
		FavouriteColor: "#000",
	}

	err := validate.Struct(user)
	if err != nil {
		fmt.Println(err)
	}
}

func UserStructLevelValidation(sl validator.StructLevel) {
	user := sl.Current().Interface().(User)

	if len(user.FirstName) == 0  len(user.LastName) == 0 {
		sl.ReportError(user.FirstName, "FirstName", "firstname", "firstname", "")
		sl.ReportError(user.LastName, "LastName", "lastname", "lastname", "")
	}
}

運行輸出:

$ go run customer1.go
Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'firstname' tag
Key: 'User.LastName' Error:Field validation for 'LastName' failed on the 'lastname' tag

例子5:自定義函數-直接注冊函數2

RegisterCustomTypeFunc

https://github.com/go-playground/validator/blob/master/_examples/custom/main.go

validate.RegisterCustomTypeFunc:驗證類型的自定義函數

customer2.go:

package main

import (
	"database/sql"
	"database/sql/driver"
	"fmt"
	"reflect"

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

type DbBackedUser struct {
	Name sql.NullString `validate:"required"`
	Age sql.NullInt64 `validate:"required"`
}

var validate *validator.Validate

func main() {
	validate = validator.New()

	validate.RegisterCustomTypeFunc(ValidateValuer, sql.NullString{}, sql.NullInt64{}, sql.NullBool{}, sql.NullFloat64{})

	// build object for validation
	x := DbBackedUser{Name: sql.NullString{String: "", Valid: true}, Age: sql.NullInt64{Int64: 0, Valid: false}}

	err := validate.Struct(x)
	if err != nil {
		fmt.Printf("Err(s):\n%+v\n", err)
	}
}

func ValidateValuer(field reflect.Value) interface{} {
	if valuer, ok := field.Interface().(driver.Valuer); ok {
		val, err := valuer.Value()
		if err == nil {
			return val
		}
		// handle the error how you want
	}
	return nil
}

運行輸出:

$ go run customer.go
Err(s):
Key: 'DbBackedUser.Name' Error:Field validation for 'Name' failed on the 'required' tag
Key: 'DbBackedUser.Age' Error:Field validation for 'Age' failed on the 'required' tag

注意,這個函數
RegisterCustomTypeFunc,它上面有2行注釋:

// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types
//
// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation

它是一個驗證數據類型自定義函數,NOTE:這個方法不是線程安全的

五、參考

https://github.com/go-playground/validator/blob/master/README.mdhttps://github.com/go-playground/validator/tree/master/_examples

總結

到此這篇關于golang常用庫:字段參數驗證庫-validator使用的文章就介紹到這了,更多相關golang字段參數驗證庫validator內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang之數據校驗的實現代碼示例
  • golang之數據驗證validator的實現
  • golang validator參數校驗的實現

標簽:廣西 太原 慶陽 西雙版納 阿克蘇 調研邀請 德州 貴陽

巨人網絡通訊聲明:本文標題《golang常用庫之字段參數驗證庫-validator使用詳解》,本文關鍵詞  golang,常用,庫之,字段,參數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang常用庫之字段參數驗證庫-validator使用詳解》相關的同類信息!
  • 本頁收集關于golang常用庫之字段參數驗證庫-validator使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产成人三级在线观看| 日韩精品免费专区| 亚洲一区二区在线视频| 日韩欧美视频在线| 91成人国产精品| 国产a视频精品免费观看| 奇米影视7777精品一区二区| 亚洲日本电影在线| 中文字幕免费在线观看视频一区| 欧美久久一二三四区| 在线免费视频一区二区| 国产成人精品影视| 国产乱码字幕精品高清av| 久久国产剧场电影| 蜜臀av一级做a爰片久久| 午夜精品爽啪视频| 午夜欧美电影在线观看| 欧美亚日韩国产aⅴ精品中极品| 成人午夜免费电影| 国产成人日日夜夜| 精品综合免费视频观看| 白白色亚洲国产精品| 成人激情视频网站| 成人av网在线| 色婷婷综合久色| 欧美自拍偷拍午夜视频| 国产高清在线观看免费不卡| 免费欧美在线视频| 激情深爱一区二区| 成人中文字幕在线| 色综合天天视频在线观看| 91久久精品国产91性色tv| 91久久一区二区| 欧美美女喷水视频| 2021中文字幕一区亚洲| 国产亚洲欧美色| 专区另类欧美日韩| 亚洲va欧美va人人爽| 日韩av电影天堂| 国产精品一区二区在线观看网站 | 国产精品久久久久精k8| 中文字幕第一区第二区| 日本道精品一区二区三区| 在线观看日韩毛片| 欧美一区二区三区免费在线看| 日韩欧美中文字幕公布| 久久久噜噜噜久久人人看 | av不卡免费在线观看| 91高清视频免费看| 日韩免费福利电影在线观看| 日本在线观看不卡视频| 久久综合视频网| 一区二区成人在线观看| 久久精品国内一区二区三区| 成人在线综合网站| 欧美精品777| 亚洲精品第一国产综合野| 丁香五精品蜜臀久久久久99网站| 欧美做爰猛烈大尺度电影无法无天| 91精品国产综合久久香蕉麻豆 | 97久久人人超碰| 一本久久精品一区二区| 宅男在线国产精品| 日韩毛片高清在线播放| 三级不卡在线观看| www.在线欧美| 亚洲精品在线观看网站| 在线一区二区三区四区五区| 精品国产sm最大网站| 一区二区三区成人| 国产sm精品调教视频网站| 日韩一区二区在线看片| 亚洲青青青在线视频| 久久99精品久久久久久动态图| 在线视频综合导航| 国产精品福利影院| 国产乱码精品1区2区3区| 国产成人99久久亚洲综合精品| 91小视频在线观看| 国产女人水真多18毛片18精品视频| 日本免费在线视频不卡一不卡二| 一本色道**综合亚洲精品蜜桃冫 | 91在线视频网址| 久久精品男人天堂av| 蜜桃av一区二区在线观看| 欧美蜜桃一区二区三区| 一个色综合av| 一本高清dvd不卡在线观看| 国产精品午夜免费| 国产精品一区免费视频| 久久久久国产精品人| 国产一区二区毛片| 久久久国产一区二区三区四区小说| 蜜桃av噜噜一区二区三区小说| 欧美另类久久久品| 午夜激情综合网| 国产精品久久三区| 亚洲国产精品v| 国产成人午夜视频| 久久久不卡网国产精品一区| 久久国产麻豆精品| 久久无码av三级| 丰满岳乱妇一区二区三区| 久久久久久久综合狠狠综合| 国产在线精品一区二区不卡了 | 亚洲国产精品黑人久久久| 国产精品资源站在线| 在线视频欧美精品| 亚洲动漫第一页| 欧美一区永久视频免费观看| 午夜免费欧美电影| 欧美一区二区三区精品| 久久激情五月婷婷| 国产亚洲欧美色| av高清不卡在线| 中文字幕在线一区二区三区| 91香蕉视频在线| 日本不卡视频一二三区| 精品久久久久一区| 不卡一卡二卡三乱码免费网站| 亚洲女性喷水在线观看一区| 欧美三级午夜理伦三级中视频| 日韩黄色免费电影| 久久久综合视频| 色哟哟欧美精品| 看电影不卡的网站| 中文字幕亚洲区| 蜜桃视频免费观看一区| 国产色产综合色产在线视频 | 国产乱码精品1区2区3区| 日韩理论片在线| 91精品国产丝袜白色高跟鞋| 丁香激情综合五月| 亚洲h在线观看| 亚洲精品乱码久久久久久久久 | 久久天堂av综合合色蜜桃网| 不卡大黄网站免费看| 亚洲成人一二三| 国产日韩亚洲欧美综合| 欧美午夜理伦三级在线观看| 黄色小说综合网站| 亚洲一级二级三级在线免费观看| 精品国产一区久久| 91黄色免费观看| 国产成人99久久亚洲综合精品| 天天av天天翘天天综合网色鬼国产| 国产日韩精品一区二区三区| 91精品国产入口| 91蜜桃传媒精品久久久一区二区| 免费在线欧美视频| 亚洲一区中文日韩| 国产欧美精品国产国产专区| 日韩一卡二卡三卡四卡| 在线免费不卡视频| 粉嫩aⅴ一区二区三区四区五区| 欧美96一区二区免费视频| 91在线观看下载| 国内成+人亚洲+欧美+综合在线| 亚洲成av人片在线观看无码| 国产精品每日更新| 国产亚洲精品免费| 久久综合久色欧美综合狠狠| 91精品欧美久久久久久动漫| 欧美日韩免费电影| 在线亚洲精品福利网址导航| 97国产一区二区| 99re视频精品| 国产成人精品aa毛片| 日韩精品一二三四| 亚洲综合色在线| 亚洲精品国产一区二区三区四区在线| 中文字幕在线一区| 亚洲视频综合在线| 日韩一区在线播放| 亚洲精品美腿丝袜| 亚洲第一二三四区| 三级久久三级久久久| 日本不卡123| 久久国产精品一区二区| 国产又黄又大久久| 国产成人av一区二区三区在线 | 久久精品在线免费观看| 日韩一级二级三级| 日韩美女在线视频| 久久嫩草精品久久久精品一| 欧美激情一区二区三区蜜桃视频| 久久久噜噜噜久久人人看 | 91精品国产欧美一区二区成人| 欧美日韩大陆一区二区| 欧美日韩国产另类不卡| 91精品福利在线一区二区三区| 欧美一级高清片在线观看| 精品日韩一区二区三区| 久久精品一二三| 一区二区三区在线免费观看| 午夜电影一区二区三区| 精品亚洲免费视频| 国产精品亚洲视频| 成人三级伦理片| 欧美日韩在线播放|