golang用字符串反射实例化结构体

来源:转载

在golang的开发中,经常会需要根据不同的字符串实例化不同的结构体。例如如下结构体

type Foo struct { Id int Name string}

当我们接收到不同的参数的时候,根据参数值实例化不同的结构体,例如收到”Foo”就需要实例化Foo这个结构体。

php处理

在php中处理比较简单,直接通过new $objectName();就可以了。

class Foo {}$objectName = "Foo";$object = new $objectName(); golang处理

golang中目前找到一种方式:先将需要实例化的结构体保存到一个字典中,如下所示

var regStruct map[string]interface{}regStruct = make(map[string]interface{})regStruct["Foo"] = Foo{}regStruct["Bar"] = Bar{}

根据字符串str可以通过regStruct[str]取到对应的对象,而后通过反射包reflect取到其类型,最后再new以下就可以了。

t := reflect.ValueOf(regStruct[str]).Type()v := reflect.New(t).Elem() 完整示例 package mainimport ( "fmt" "reflect")type Foo struct {}type Bar struct {}//用于保存实例化的结构体对象var regStruct map[string]interface{}func main() { str := "Bar" if regStruct[str] != nil { t := reflect.ValueOf(regStruct[str]).Type() v := reflect.New(t).Elem() fmt.Println(v) }}func init() { regStruct = make(map[string]interface{}) regStruct["Foo"] = Foo{} regStruct["Bar"] = Bar{}}



分享给朋友:
您可能感兴趣的文章:
随机阅读: