go - 如何使用自定义验证器验证结构数据类型?
问题描述
我go-playground/validator/v10
用来验证一些输入并且在使用自定义验证标签和函数时遇到了一些问题。问题是当结构字段之一是不同的结构时,不会调用该函数。这是一个例子:
type ChildStruct struct {
Value int
}
type ParentStruct struct {
Child ChildStruct `validate:"myValidate"`
}
func myValidate(fl validator.FieldLevel) bool {
fmt.Println("INSIDE MY VALIDATOR") // <- This is never printed
return false
}
func main() {
validator := validator.New()
validator.RegisterValidation("myValidate", myValidate)
data := &ParentStruct{
Child: ChildStruct{
Value: 10,
},
}
validateErr := validator.Struct(data)
if validateErr != nil { // <- This is always nil since MyValidate is never called
fmt.Println("GOT ERROR")
fmt.Println(validateErr)
}
fmt.Println("DONE")
}
如果我将 parentStruct 更改为:
type ParentStruct struct {
Child int `validate:"myValidate"`
}
一切正常。但是,如果我将validate:"myValidate"
部件添加到 ChildStruct 它也可以工作,那么返回的错误是说 ChildStruct.Value 是错误的,而它应该说 ParentStruct.Child 是错误的。
有人知道我在做什么错吗?
解决方案
经过一段时间的搜索,我终于找到了一个名为的函数RegisterCustomTypeFunc
,它注册了一个自定义类型,可以对其go-playground/validator/v10
进行验证。因此解决方案是将以下内容添加到问题中的示例中:
func childStructCustomTypeFunc(field reflect.Value) interface{} {
if value, ok := field.Interface().(ChildStruct); ok {
return value.Value
}
return nil
}
和...一起:
validator.RegisterCustomTypeFunc(childStructCustomTypeFunc, ChildStruct{})
现在验证器将进入myValidate
函数,返回消息将是该ParentStruct.Child
字段的错误
推荐阅读
- javascript - Cordova 从缓冲区读取 html5 视频
- uwp - 如何在继承的控件中绑定到自身?
- symfony - Symfony3 形式将 0 转换为 NULL 值
- xamarin - 如何用 UWP xamarin 表单中的其他图标替换汉堡包图标
- json - 如何在 ReadTheDocs 上将 doson 小部件与 Sphinx 一起使用
- angular - Rxjs 订阅多次触发
- windows - 在 PyQt 上声明列表时出现未知的语法错误
- javascript - 带有 PHP 的子表的 Javascript 格式函数
- javascript - 有没有办法简化 React.js 中状态内的一长串代码
- android - Fabric Debug Craslytic 报告:注册,缺少构建 ID,应用插件:io.fabric