最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

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

Golang 2880浏览 2评论

在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用字符串反射实例化结构体

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 但是生成的V没法赋值啊,例如,struct有个字段name,v.name会报错的
    phil1年前 (2016-05-20)回复
    • 陈杰斌
      用下面的方式可以为字段进行赋值
      f := v.FieldByName("Name")
      if f.IsValid() && f.CanSet() && f.Kind() == reflect.String {
      f.SetString("tom")
      }
      陈杰斌1年前 (2016-05-22)回复