【发布时间】:2014-09-14 06:53:23
【问题描述】:
我想扩展 go-validator 以返回更好的类型:
type Error map[string][]error
// Will output the first error when stringified (e.g. for json response).
func (err Error) Error() string {
for k, errs := range err {
return fmt.Sprintf("%s value had %s", k, errs[0].Error())
}
return "no error"
}
func Validate(v interface{}) error {
if ok, errs := DefaultValidator.Validate(v); !ok {
return Error(errs)
}
return nil
}
当我正在为此编写测试时,我遇到了一个问题,即类型化映射 Error 似乎失去了它的索引功能:
err = Validate(Value{
Foo: "bar",
Email: "foo@bar.me",
Required: "1234",
})
c.Check(err, check.IsNil)
err, ok := Validate(Value{}).(Error)
c.Check(ok, check.Equals, true)
c.Check(err["Foo"], check.DeepEquals, []error{validator.ErrMin})
c.Check(err["Email"], check.DeepEquals, []error{validator.ErrInvalid})
c.Check(err["Required"], check.DeepEquals, []error{validator.ErrZeroValue})
返回:
model/validation/validation_test.go:42: invalid operation: err["Foo"] (type error does not support indexing)
model/validation/validation_test.go:43: invalid operation: err["Email"] (type error does not support indexing)
model/validation/validation_test.go:44: invalid operation: err["Required"] (type error does not support indexing)
我也尝试转换为 map[string][]error 类型,但得到“不可能的类型断言”。
我的方法有什么问题? 我怎样才能让索引恢复工作?
【问题讨论】:
-
奇怪,考虑到这项工作:play.golang.org/p/J5oU0SFYVF
-
@VonC 你认为这是一个错误吗?
-
这取决于
c.Check的定义:你能分享一个指向该Check方法源的链接吗? -
这里我没有任何内容地重写它:play.golang.org/p/JAbBMDLU9Z
-
c.Check 来自gocheck
标签: go type-conversion