go - 如果我包装我的对象,Golang 转换为自定义类型会失败
问题描述
在我的应用程序中,我validator.v9
用来验证我的模型。验证后我可以转换error
界面并且它成功了,我在控制台上看到“OK”
err := v.ModelValidator.Struct(model)
if _, ok := err.(validator.ValidationErrors); ok {
fmt.Println("ValidateModel: OK")
} else{
fmt.Println("ValidateModel: FALSE")
}
我需要将此对象包装到另一个对象以供将来处理
type errValidation struct {
error
}
func ValidationError(err error) error {
return errValidation{err}
}
但是,如果我尝试将这个包装的对象validator.ValidationErrors
从上面的第一个案例中转换回位于转换下方的同一个函数中,它会失败
e := ValidationError(err)
if _, ok := e.(validator.ValidationErrors); ok {
fmt.Println("ValidationError: OK")
} else{
fmt.Println("ValidationError: FALSE")
}
我在控制台中看到
ValidateModel: OK
ValidationError: FALSE
我怎样才能使这个演员从包裹的物体中工作?
ValidationErrors
从"gopkg.in/go-playground/validator.v9"
看起来像这样
type ValidationErrors []FieldError
func (ve ValidationErrors) Error() string {
//.....
}
解决方案
你的errValidation
类型和validator.ValidationErrors
类型是完全不同的,截然不同的类型。如果一个接口值包含一个具体类型的值errValidation
,你不能从它类型断言另一个具体类型,只有errValidation
.
所以这将起作用:
e := ValidationError(errors.New("some err"))
if _, ok := e.(errValidation); ok {
fmt.Println("ValidationError: OK")
} else {
fmt.Println("ValidationError: FALSE")
}
输出将是(在Go Playground上尝试):
ValidationError: OK
推荐阅读
- python - 从其他函数注释派生的 Python 类型提示
- pandas - 用零替换所有 NaN 值的函数:
- excel - 如何在循环中将多个文件附加到消息中?
- bash - 用于检查在运行命令后是否在目录上创建了新文件的 Bash 脚本
- visual-studio-code - VS Code 保持专注
- python - 如何从 googlesheets 中获取列标题以在 Python 中打印?
- php - 如何使用 make 从 tgz 文件构建 php 扩展?
- android - 已弃用功能的问题
- xamarin.forms - mvvmcross xamarin.forms PictureChooser
- gradle - Gradle 预编译脚本插件:未找到外部 Quarkus 插件依赖项