我正在使用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
的结构片段,它实际上会转到客户端。额外的转换可能是重复和无意义的,但是,现在,它纯粹是一个学习作品,我可能会在一两个小时内重构它。
答案 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