将错误切片转换为golang中的一个结构片段

时间:2017-07-28 08:11:04

标签: validation go casting slice

我正在使用Golang validate库作为API的一部分进行输入错误检查(用于学习目的的愚蠢的演示API)。

当执行验证时,返回一片error s。实际上,切片由validate库的struct BadField组成,如下所示:

type BadField struct {
    Field string
    Err   error
}

func (b BadField) Error() string {
    return fmt.Sprintf("field %s is invalid: %v", b.Field, b.Err)
}

我想传递一个更具体的切片,而不是[]error我想要[]BadField,以便我可以访问Field值。

到目前为止,我找不到从一个转换/转换为另一个的方法。也许没有一个(由于go和切片的性质)。也许有一个包将为我做这件事。

我的初步实施

我想出的方法是遍历切片并单独抛出每个元素。

errors := valueWithBadStuff.Validate()

validationErrors := make([]validate.BadField, len(errors))
for _, err := range errors {
    validationError, ok := err.(validate.BadField)
    if !ok {
        panic("badarghfiremyeyes") // S/O purposes only
    }
    validationErrors = append(validationErrors, validationError)
}

对于“简单”的东西感觉有点长,但也许有更多的惯用方式?还是更好的方式?

对于后台,我的意图(目前)是获取验证错误的片段并将其作为JSON对象数组传回客户端,其中包含Field名称和错误消息(即虚构的age字段:["field_name": "age", "Cannot be less than 0"]

在上面的循环之后,我执行了更多转换,以生成一个标记为json的结构片段,它实际上会转到客户端。额外的转换可能是重复和无意义的,但是,现在,它纯粹是一个学习作品,我可能会在一两个小时内重构它。

1 个答案:

答案 0 :(得分:3)

实际上并没有“更好”的方法。要转换切片,您必须基本上执行您已经发现的切片。

如果您只是将这些错误返回给客户端,则可能根本不需要对此进行类型转换。

实现JSON Marshaler接口,您可以使您的类型自动以您希望的格式输出JSON。例如,对于上面给出的格式,这将是:

func (e BadField)  MarshalJSON() ([]byte, error) {
   return json.Marshal([]string{"field_name",e.Field,e.Err.Error()})
}

但我怀疑你可能更喜欢回复:

[  
   {  
      "field":"age",
      "error":"msg1"
   },
   {  
      "field":"name",
      "error":"msg2"
   }
]

为此,您只需将JSON标记添加到结构定义中,例如

type BadField struct {
    Field string `json:"field"`
    Err   error `json:"error"`
} 

这意味着在包含json.Marshal个实例的[]error切片上调用BadField会导致上面的JSON。

阅读有关JSON & Go

的更多信息可能会有所帮助

PS考虑您是否希望自己的方法为value or pointer receivers

相关问题