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