【发布时间】:2018-02-26 15:21:43
【问题描述】:
我知道在 go 中反射通常是不受欢迎的,但就我目前的目的而言,我很确定这是最好的解决方案。
基本上我的项目是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 编码/解码)。但是我需要将其简要转换为具体类型以使用结构注释进行验证 所以例如我可能会做这样的事情:
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 不是类型
那么,如何存储类型的值以供以后的类型断言使用
注意:在 cmets 与 JimB 的讨论之后,我似乎实际上不需要具体类型来进行验证(接口很好),但我仍然需要进一步断言响应类型以提供自定义响应处理程序
【问题讨论】:
标签: go reflection