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

李鹏0 90 次浏览

在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 main
import (
      "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{}
}


发表评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen