在 Go 中,从字符串创建类型的新实例并不是一项简单的任务。 Go 的静态类型和死代码消除机制使得基于存储为字符串的类型名称动态创建对象变得困难。
要解决此限制,一种方法是维护全局 map[string]reflect.Type。该映射可以填充在定义可发现类型的包的 init() 函数中。通过使用这个映射,您可以查找所需类型的reflect.Type,并使用reflect.New来获取指向该类型的新对象的指针。
type MyStruct struct { // ... } func init() { register("MyStruct", reflect.TypeOf(MyStruct{})) }
注册后,您可以创建一个使用反射的新实例:
newObject := reflect.New(registered["MyStruct"]).Elem().Interface() myStruct := newObject.(MyStruct)
但是,重要的是要考虑反射会带来性能开销并增加代码的复杂性。探索替代方法可能更合适,例如:
以上是如何从字符串实例化 Go 中的新类型?的详细内容。更多信息请关注PHP中文网其他相关文章!