Go 类型化映射不支持索引

Go 类型化映射不支持索引,go,type-conversion,Go,Type Conversion,我想扩展以返回更好的类型: 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())

我想扩展以返回更好的类型:

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
}
由于我现在正在为此编写测试,我遇到了一个问题,即类型化映射
错误
似乎已经失去了它的索引功能:

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)
我还试图强制转换为type
map[string][]error
,但得到了“不可能的类型断言”


我的方法有什么问题?如何使索引恢复工作?

您的err变量似乎是用
error
类型初始化的。当你这样做的时候

err, ok := Validate(Value{}).(Error)
您只需检查err是否实际上是一个
错误
。如果你把err改成errs,它应该会起作用


操场示例:

奇怪,考虑到这项工作:@VonC你认为这是一个bug?这取决于
c.Check
定义:你能分享到
Check
方法的源代码的链接吗?这里我重写了它,没有任何内容:c.Check来自谢谢!你是对的。我在上面的某个地方定义了
var error error
,并且
:=
没有覆盖var类型……实际上,您根本无法在Go中“覆盖”类型。您可以在接口变量中存储不同类型的值,但它们仍然具有静态类型的接口。也就是说,一个由两个指针组成的“结构”,第一个指针指向值,另一个指针指向类型信息。有关更多详细信息,请参阅。