在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{} }
转载请注明:快乐编程 » golang用字符串反射实例化结构体
f := v.FieldByName("Name")
if f.IsValid() && f.CanSet() && f.Kind() == reflect.String {
f.SetString("tom")
}