为什么我不能将Error()用于类型验证器。

时间:2019-10-29 10:42:10

标签: go error-handling interface

我正在使用go验证器,一切都很好。我可以使用从err打印所有内容,但是不能使用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

1 个答案:

答案 0 :(得分:1)

您的“外部” errerror(由validate.Struct()返回),它具有Error()方法。

但是err循环变量不是。您从“外部” err中输入断言validator.ValidationErrors

type ValidationErrors []FieldError

FieldError是接口类型,但没有Error()方法。

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

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

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