首页 > 文章列表 > 有没有办法从字符串创建结构的实例?

有没有办法从字符串创建结构的实例?

golang
121 2023-03-10

问题内容

给定一个结构:

type MyStruct struct {
    A int
    B int
}

和一个带有结构名称的字符串

a := "MyStruct"

要么

a := "mypkg.MyStruct"

如何从字符串名称而不是结构创建结构的实例?这个想法是我将创建一个应用程序,其中所有结构都链接到二进制文件中,但从字符串创建运行时实例。(有点像元元)

正确答案

Go 中没有类型的中央注册表,因此在一般情况下,您所问的问题是不可能的。

您可以手动构建自己的注册表以使用从字符串到reflect.Type对应于每种类型的值的映射来支持此类功能。例如:

var typeRegistry = make(map[string]reflect.Type)

func init() {
    myTypes := []interface{}{MyString{}}
    for _, v := range myTypes {
        // typeRegistry["MyString"] = reflect.TypeOf(MyString{})
        typeRegistry[fmt.Sprintf("%T", v)] = reflect.TypeOf(v)
    }
}

然后,您可以创建如下类型的实例:

func makeInstance(name string) interface{} {
    v := reflect.New(typeRegistry[name]).Elem()
    // Maybe fill in fields here if necessary
    return v.Interface()
}