我正在尝试基于字符串动态创建结构。在下面的示例中,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个赞
该函数返回类型Car
和Bus
写入的值。如果您希望输入的变量main
具有特定类型,请使用类型断言:
c := makeInstance("Car").(Car)
如果您的目标是获取指向这些类型值的指针,则返回指针makeInstance
:
func makeInstance(name string) interface{} { return reflect.New(typeRegistry[name]).Interface() }
拉风的咖菲猫
TA贡献1995条经验 获得超2个赞
您可能应该停下来阅读有关接口值类型断言的内容。Go 不是一种动态类型的语言,您尝试做的事情很可能会失败:
只要您在与您一起工作,interface{}
您就无法在不进行反射的情况下访问这些字段(制造商、型号、座位、路线...)。如果你想写x.Make
你必须有一个x
类型Car
或*Car
(而不是接口{})。
要从c
of 类型interface{}
变为例如 a,Car
您必须键入 assert:
var car Car = c.(Car)
请注意,您不能进行动态类型断言(没有反射),c.(Car)
如果 c 包含例如 a ,那将会失败Bus
。因此,在 json.Unmarshaling 到通用接口{}之后,您将必须打开已知类型并断言该类型。这意味着您无论如何都要为每种类型编写专用代码。
- 2 回答
- 0 关注
- 103 浏览
添加回答
举报
0/150
提交
取消