实例新类型(Golang)

Acc*_*cex 17 types instance go go-reflect

谁能告诉我如何从字符串中创建Type的新实例?反映?

有一些例子,但它们适用于语言[:(]的旧版本(前Go 1版本)

tux*_*21b 31

因此,如果我正确理解了您的问题,那么当您将类型的名称作为字符串时,您就会询问如何创建对象.因此,例如,您可能有一个字符串"MyStruct",并且您想要创建此类型的对象.

不幸的是,这是不可能的,因为Go是一种静态类型语言,链接器将消除死代码(或内联部分).因此,无法保证您的最终可执行文件甚至包含"MyStruct"代码.

但是,您可以map[string]reflect.Type手动维护全局.例如,通过在init()包的函数中初始化此映射来定义此类可发现类型.这也将告诉编译器您正在使用这些类型.然后,您可以使用此映射查找您要创建的类型的reflect.Type并使用reflect.New获取指向该类型的新对象的指针(存储为reflect.Value).您可以使用以下内容将对象提取到接口中:

reflect.New(yourtype).Elem().Interface()
Run Code Online (Sandbox Code Playgroud)

Elem()将取消引用指针,Interface()将返回反射值作为interface{}.有关详细信息,请参阅反思定律.

PS:可能有一种更好的方法来构建程序,它甚至不需要反射,并且让编译器捕获更多错误.您是否考虑过使用工厂方法?另一个简单的解决方案可能是维护一个map[string]func() interface{}可以调用的函数来创建具有该名称的新对象.

  • 你如何在Go中实现工厂方法? (2认同)

Mir*_*sin 6

具有预定义构造函数的工厂可以基于以下内容:

package main

import (
    "fmt"
)

type Creator func() interface{}

type A struct {
    a int
}

type B struct {
    a bool
}

func NewA() interface{} {
    return new(A)
}

func NewB() interface{} {
    return new(B)
}

func main() {
    m := map[string]Creator{}
    m["A"] = NewA
    m["B"] = NewB
    for k, v := range m {
        fmt.Printf("%v -> %v\n", k, v())
    }
}
Run Code Online (Sandbox Code Playgroud)