我知道反思通常是不受欢迎的,但对于我目前的目的,我很确定这是最好的解决方案。
基本上我的项目是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的评论中讨论之后,似乎我实际上并不需要用于验证目的的具体类型(接口很好)但我还需要进一步断言响应类型以提供自定义响应处理程序