当前位置: 首页 > 面试题库 >

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

微生学
2023-03-14
问题内容

给定一个结构:

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()
}


 类似资料:
  • 问题内容: 让我们说我有这样的查询: 通过在各处手动更改字符串,我使用不同的表多次运行此查询。我尝试声明以下内容: 但这似乎不起作用,因为它引发了一个错误,提示我必须先声明为表变量,然后才能使用它。我如何对表名进行模板化,如果可以的话,Intellisense仍然可以使用吗? 问题答案: 您可以将其包装在EXEC语句中,如下所示: 但是不,在这种情况下,智能感知将无法正常工作。 如果您事先知道输出

  • 问题内容: 还是我必须有一个调用env-> NewDirectByteBuffer(buffer,size)的JNI帮助函数? 问题答案: 我要做的是创建一个普通的DirectByteBuffer并更改其地址。 从这一点开始,您可以访问引用基础地址的ByteBuffer。我这样做是为了访问网络适配器上的内存以实现零拷贝,并且工作正常。 您可以直接为您的地址创建一个DirectByteBuffer,

  • 我有以下2种方法: 两种方法的内容相等,我尝试使用以下方法: 但当我尝试将其与字符串或Long iterable一起使用时,它会引发编译错误。有什么解决方案吗?

  • 在C中,如果值不能为NULL,则通常引用传递而不是指针。 假设我有一个具有以下签名的函数,该签名通常与字符串文字一起使用。 我想知道如何更改函数,使其接受引用(并且具有不接受NULL的优势)? > 另一个选项是

  • 我已经在我的服务器上安装了docker,这是linux机器,我是从另一个系统(windows)编码,是否有任何直接从服务器创建dockerized图像?这是我正在使用的文件。 是否可以用服务器的路径或任何其他方式替换,以便直接从服务器创建映像,而不需要将文件复制并粘贴到服务器,然后创建映像??

  • 问题内容: 我们有一个使用Maven作为其构建/依赖管理工具的项目。但是我们的代码需要在客户的站点上进行编译,并且客户要求我们交付为Ant编写的构建脚本。 因此,当我们需要将代码交付给客户端时,我们希望继续使用Maven并自动生成Ant脚本。 我们能做到吗? 问题答案: 您可以使用Maven Ant插件。