猿问

基于字符串动态创建对象

我正在尝试基于字符串动态创建结构。


在下面的示例中,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 响应解组到其中。我正在尝试动态创建对象,这样我就可以避免检查车辆是否=汽车、车辆是否=公共汽车等,因为我最终会拥有多种类型的车辆,但可能并不总是拥有所有车辆,而且看起来很啰嗦。


MM们
浏览 104回答 2
2回答

慕的地10843

该函数返回类型Car和Bus写入的值。如果您希望输入的变量main具有特定类型,请使用类型断言:c := makeInstance("Car").(Car)如果您的目标是获取指向这些类型值的指针,则返回指针makeInstance:func makeInstance(name string) interface{} {    return reflect.New(typeRegistry[name]).Interface() }

拉风的咖菲猫

您可能应该停下来阅读有关接口值类型断言的内容。Go 不是一种动态类型的语言,您尝试做的事情很可能会失败:只要您在与您一起工作,interface{}您就无法在不进行反射的情况下访问这些字段(制造商、型号、座位、路线...)。如果你想写x.Make你必须有一个x类型Car或*Car(而不是接口{})。要从cof 类型interface{}变为例如 a,Car您必须键入 assert:var car Car = c.(Car)请注意,您不能进行动态类型断言(没有反射),c.(Car)如果 c 包含例如 a ,那将会失败Bus。因此,在 json.Unmarshaling 到通用接口{}之后,您将必须打开已知类型并断言该类型。这意味着您无论如何都要为每种类型编写专用代码。
随时随地看视频慕课网APP

相关分类

Go
我要回答