【问题标题】:Why I cannot use Error() for type validator.FieldError为什么我不能将 Error() 用于类型 validator.FieldError
【发布时间】:2019-10-29 10:42:10
【问题描述】:

我正在使用 go 验证器,一切都很好。我可以使用打印错误的所有内容,但不能使用Error() 或将err 转换为string。有人可以帮我解决这个问题吗?

显示

err.Error undefined (type validator.FieldError has no field or method Error)

我的代码:

err = validate.Struct(myData)

if err != nil {

    for _, err := range err.(validator.ValidationErrors) {
        fmt.Println(err)
        fmt.Println(err.Namespace())
        fmt.Println(err.Field())
        fmt.Println(err.StructNamespace())
        fmt.Println(err.StructField())
        fmt.Println(err.Tag())
        fmt.Println(err.ActualTag())
        fmt.Println(err.Kind())
        fmt.Println(err.Type())
        err.Error()

    }

    return
}

有没有办法使用接口Error()?或者将err 转换为string?

【问题讨论】:

    标签: go error-handling interface


    【解决方案1】:

    你的“外部”err 是一个error(由validate.Struct() 返回),它有一个Error() 方法。

    但err 循环变量不是。您从“外部”err 键入 assert validator.ValidationErrors,即:

    type ValidationErrors []FieldError
    

    其中FieldError 是一个接口类型,但它没有Error() 方法。

    您可以在循环之前或之后(但不在循环内部)调用并打印“外部”err 变量的错误字符串。

    if err != nil {
        fmt.Println(err.Error())
        for _, err := range err.(validator.ValidationErrors) {
            // ...
        }
    }
    

    为避免这种混淆,请为循环变量使用不同的名称,尤其是因为它不是error 类型。 fieldErr 或简单的 fe(如字段错误)将是一个好名字。

    【讨论】:

    • 谢谢你,你拯救了我的一天。那是我从 Go Validator 文档中复制的代码,我确实错过了类型断言部分,我认为它具有相同的接口 Error()。
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2022-01-26
    • 2014-01-15
    • 2021-07-18
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多