键入的地图不支持索引

时间:2014-07-23 07:42:06

标签: go type-conversion

我想扩展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类型但得到了#34;不可能的类型断言"。

我的方法有什么问题? 如何让索引重新开始工作?

1 个答案:

答案 0 :(得分:2)

似乎您的错误变量是使用error类型初始化的。当你这样做

err, ok := Validate(Value{}).(Error)

你只是检查错误是否真的是Error。如果你改错,那就说错了,它应该有效。

游乐场示例:http://play.golang.org/p/ljNroPzVbd