一尘不染

有没有一种方法可以从字符串创建结构实例?

go

给定一个结构:

type MyStruct struct {
    A int
    B int
}

以及带有结构名称的字符串

a := "MyStruct"

要么

a := "mypkg.MyStruct"

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


阅读 222

收藏
2020-07-02

共1个答案

一尘不染

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()
}
2020-07-02