gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:29 25 4
gpt4 key购买 nike

<分区>

我知道反射在 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 is not a type

那么,我该如何存储一个类型的值以供以后的类型断言

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com