-4

在下面的 Go 函数中,当我尝试运行 build 命令生成 pb.go 文件时出现错误。恐慌:接口转换:接口 {} 是 []uint8,而不是 *validator.FieldValidator github.com/mygithub/myproject/plugin.getFieldValidatorIfAny(0xc0001d4b60, 0x5b5020)

有关如何解决此问题的任何建议

func getFieldValidatorIfAny(field *descriptor.FieldDescriptorProto) *validator.FieldValidator {
    if field.Options != nil {
        v, err := proto.GetExtension(field.Options, validator.E_Field)
        if err == nil && v.(*validator.FieldValidator) != nil {
            return (v.(*validator.FieldValidator))
        }
    }
    return nil
}

我正在尝试使用https://github.com/mwitkow/go-proto-validators添加验证

4

1 回答 1

1

每个https://beta.pkg.go.dev/github.com/golang/protobuf/proto#GetExtension(强调我的):

如果描述符的类型是完整的(即 ExtensionDesc.ExtensionType 不为零),则 GetExtension 解析编码字段并返回指定类型的 Go 值。如果该字段不存在,则返回默认值(如果指定了),否则报告 ErrMissingExtension。

如果描述符类型不完整(即 ExtensionDesc.ExtensionType 为 nil),则 GetExtension 返回扩展字段的原始编码字节。

因此,这里似乎validator.E_Field是“类型不完整”。您可能需要在定义扩展的包上添加依赖项,以便注册其类型 - 可能通过使用import _ "example.com/some/proto"将其链接到您的二进制文件。

于 2021-08-27T15:52:45.493 回答