如何使用reflect.Type来执行类型断言

时间:2018-02-26 15:21:44

标签: go reflection

我知道反思通常是不受欢迎的,但对于我目前的目的,我很确定这是最好的解决方案。

基本上我的项目是cli工具,它将根据传入的命令输出xml查询并返回相应的结果。

每个命令请求都有一些样板代码,其中填充了默认值并验证了提供的值。

所以我有一系列基于Command结构的Command对象,如下所示:

type Command struct {
    Name        string
    Request     interface{}
    RequestType reflect.Type
    Response    interface{}

    RegisterFunc func(parentCmd *cobra.Command, cmd *Command) error
}

在大多数情况下,我真的不关心请求/响应的类型(只是xml编码/解码)。但是,我需要简要地将其转换为具体类型以使用struct注释进行验证 例如,我可能会这样做:

    var ccReq *CreateCredentialRequest
    var set bool
    if ccReq, set = command.Request.(*CreateCredentialRequest); !set {
        log.Fatal(errors.New("invalid request type"))
    }

    result, err := govalidator.ValidateStruct(ccReq)
    if err != nil {
        println("error: " + err.Error())
        os.Exit(1)
    }

然而,在理想情况下,我想对所有命令进行一般性处理,如下所示:

    var ccReq *CreateCredentialRequest
    var set bool
    if ccReq, set = command.Request.(command.RequestType); !set {
        log.Fatal(errors.New("invalid request type"))
    }

然而,这会导致错误:

  

command.RequestType不是类型

那么,如何为后来的类型断言

存储类型的值

注意:在与JimB的评论中讨论之后,似乎我实际上并不需要用于验证目的的具体类型(接口很好)但我还需要进一步断言响应类型以提供自定义响应处理程序

0 个答案:

没有答案