为了账号安全,请及时绑定邮箱和手机立即绑定

基于字符串动态创建对象

基于字符串动态创建对象

Go
MM们 2023-04-24 16:49:36
我正在尝试基于字符串动态创建结构。在下面的示例中,reflect.TypeOf &c 和 &c1 是不同的,因为我从 makeInstance 返回了 interface{}。TypeOf c 和 c1 是一样的。我的问题是如何更改处理 makeInstance 输出的方式,以便它创建一个与 c1 相同的对象,但仍然允许我创建与 b1 相同的对象?type Car struct {    Make  int `json:"make"`    Model int `json:"model"`}type Bus struct {    Seats int `json:"seats"`    Route int `json:"route"`}var typeRegistry = make(map[string]reflect.Type)func init() {    typeRegistry["Car"] = reflect.TypeOf(Car{})    typeRegistry["Bus"] = reflect.TypeOf(Bus{})}func makeInstance(name string) interface{} {    v := reflect.New(typeRegistry[name]).Elem()    return v.Interface()}func main() {    c := makeInstance("Car")    b := makeInstance("Bus")    var b1 Bus    var c1 Car    fmt.Println(reflect.TypeOf(&c))    fmt.Println(reflect.TypeOf(&c1))    fmt.Println(reflect.TypeOf(c))      fmt.Println(reflect.TypeOf(c1))编辑:我的总体结果是有一个程序读取一个 json 配置文件,该文件将列出我想要关闭的对象类型并点击 rest api 并收集例如{    "auth":[{                "username": "admin",                "password": "admin"            }],    "transport":[            {                "vehicle":["car", "bus"]            }]}当循环通过车辆时,它会点击一个 api 并执行查询并返回数据。然后我想创建一个数组,其中包含配置中包含的任何车辆,并将 json 响应解组到其中。我正在尝试动态创建对象,这样我就可以避免检查车辆是否=汽车、车辆是否=公共汽车等,因为我最终会拥有多种类型的车辆,但可能并不总是拥有所有车辆,而且看起来很啰嗦。
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

该函数返回类型CarBus写入的值。如果您希望输入的变量main具有特定类型,请使用类型断言:

c := makeInstance("Car").(Car)

如果您的目标是获取指向这些类型值的指针,则返回指针makeInstance

func makeInstance(name string) interface{} {
   return reflect.New(typeRegistry[name]).Interface()
}


查看完整回答
反对 回复 2023-04-24
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

您可能应该停下来阅读有关接口值类型断言的内容。Go 不是一种动态类型的语言,您尝试做的事情很可能会失败:

只要您在与您一起工作,interface{}您就无法在不进行反射的情况下访问这些字段(制造商、型号、座位、路线...)。如果你想写x.Make必须有一个x类型Car*Car(而不是接口{})。

要从cof 类型interface{}变为例如 a,Car必须键入 assert:

var car Car = c.(Car)

请注意,您不能进行动态类型断言(没有反射),c.(Car)如果 c 包含例如 a ,那将会失败Bus。因此,在 json.Unmarshaling 到通用接口{}之后,您将必须打开已知类型并断言该类型。这意味着您无论如何都要为每种类型编写专用代码。


查看完整回答
反对 回复 2023-04-24
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信