9c93a35685
2020/12/31:添加container包使用示例和源码分析
2020/12/31:添加validator.v8源码解析和使用示例
159 lines
3.2 KiB
Go
159 lines
3.2 KiB
Go
/*
|
||
* @Author : huangzj
|
||
* @Time : 2020/12/11 16:16
|
||
* @Description:
|
||
*/
|
||
|
||
package testValidator
|
||
|
||
import (
|
||
"Go-Tool/SourceAnalysisAndTool/validator.v8/sourceAnalysis/gopkg.in/go-playground/validator.v8"
|
||
"fmt"
|
||
"reflect"
|
||
"strconv"
|
||
"strings"
|
||
"testing"
|
||
)
|
||
|
||
func TestValidator(t *testing.T) {
|
||
fmt.Println("测试别名校验器")
|
||
testAlias()
|
||
|
||
fmt.Println()
|
||
fmt.Println("测试默认和自定义tag校验器")
|
||
testTag()
|
||
|
||
fmt.Println()
|
||
fmt.Println("测试字段校验器")
|
||
testField()
|
||
|
||
fmt.Println()
|
||
fmt.Println("测试结构体校验器")
|
||
testStruct()
|
||
|
||
}
|
||
|
||
func testStruct() {
|
||
//添加结构体校验,对结构体进行处理之后,validator的标签还是会起作用
|
||
config := &validator.Config{
|
||
TagName: "validate",
|
||
}
|
||
valid := validator.New(config)
|
||
valid.RegisterStructValidation(func(v *validator.Validate, structLevel *validator.StructLevel) {
|
||
c := structLevel.CurrentStruct.Interface().(Cat)
|
||
if c.Age < 100 {
|
||
fmt.Println("猫的岁数不能小于100")
|
||
}
|
||
}, Cat{})
|
||
p := Person{
|
||
Name: "192.168.0.1",
|
||
M: map[string]int{"A": 1},
|
||
H: 2000,
|
||
Exist: false,
|
||
Require: false,
|
||
Cat: Cat{
|
||
Age: 0,
|
||
Ower: Ower{},
|
||
},
|
||
}
|
||
|
||
err := valid.Struct(p)
|
||
fmt.Println(err)
|
||
}
|
||
|
||
func testField() {
|
||
//如果注册了对应的Field,则会调用自定义的方法,不会再使用validator定义的标签
|
||
//这边测试了结构体和基本类型,都是如上述描述的这么处理
|
||
config := &validator.Config{
|
||
TagName: "validate",
|
||
}
|
||
valid := validator.New(config)
|
||
valid.RegisterAliasValidation("ipe", "ip|ipv4|ipv6")
|
||
|
||
valid.RegisterCustomTypeFunc(func(field reflect.Value) interface{} {
|
||
d := field.Interface().(Cat)
|
||
if d.Age < 50 {
|
||
fmt.Println("狗的岁数不能小于50")
|
||
}
|
||
return field
|
||
}, Cat{})
|
||
|
||
p := Person{
|
||
Name: "192.168.0.1",
|
||
M: map[string]int{"A": 1},
|
||
H: 2000,
|
||
Exist: false,
|
||
Require: false,
|
||
Cat: Cat{
|
||
Age: 0,
|
||
Ower: Ower{},
|
||
},
|
||
}
|
||
err := valid.Struct(p)
|
||
fmt.Println(err)
|
||
|
||
valid.RegisterCustomTypeFunc(func(field reflect.Value) interface{} {
|
||
d := field.Interface().(int)
|
||
if d != 10 {
|
||
fmt.Println("测试一下")
|
||
}
|
||
return field
|
||
}, 1)
|
||
|
||
err1 := valid.Struct(p)
|
||
fmt.Println(err1)
|
||
|
||
}
|
||
|
||
func testTag() {
|
||
w := Woman{
|
||
Name: "my name is Woman",
|
||
}
|
||
|
||
w1 := Woman{
|
||
Name: "my name is wo-man",
|
||
}
|
||
|
||
config := &validator.Config{
|
||
TagName: "validate",
|
||
}
|
||
valid := validator.New(config)
|
||
_ = valid.RegisterValidation("diy", func(v *validator.Validate, topStruct reflect.Value, currentStruct reflect.Value, field reflect.Value, fieldtype reflect.Type, fieldKind reflect.Kind, param string) bool {
|
||
s := field.Interface().(string)
|
||
|
||
i, _ := strconv.ParseInt(param, 0, 64)
|
||
if int64(len(s)) < i || strings.Contains(s, "Woman") {
|
||
fmt.Println("校验一下")
|
||
return false
|
||
}
|
||
return true
|
||
})
|
||
|
||
err := valid.Struct(w)
|
||
fmt.Println(err)
|
||
|
||
err1 := valid.Struct(w1)
|
||
fmt.Println(err1)
|
||
}
|
||
|
||
func testAlias() {
|
||
m := Man{
|
||
Name: "192.168.0.1",
|
||
}
|
||
|
||
m1 := Man{
|
||
Name: "213123123",
|
||
}
|
||
|
||
config := &validator.Config{
|
||
TagName: "validate",
|
||
}
|
||
valid := validator.New(config)
|
||
valid.RegisterAliasValidation("ipe", "ip|ipv4|ipv6")
|
||
err := valid.Struct(m)
|
||
fmt.Println(err)
|
||
|
||
err1 := valid.Struct(m1)
|
||
fmt.Println(err1)
|
||
}
|