golang 动态 实例化 结构体
来源:互联网 发布:淘宝助理设置快递模板 编辑:程序博客网 时间:2024/05/23 13:36
真理 http://stackoverflow.com/questions/10210188/instance-new-type-golang
So, if I understand your question correctly, you are asking about how you can create an object when you just have the name of the type as string. So, for example, you might have a string "MyStruct" and you want to create an object of this type.
Unfortunately, that's not easily possible because Go is a statically typed language and the linker will eliminate dead code (or inline parts of it). So, there is no guarantee, that your final executable will even contain the code of "MyStruct".
You can however, maintain a global map[string]reflect.Type
manually. For example by initializing this map in the init()
function of your packages which defines such discover-able types. This will also tell the compiler that you are using the types. Afterwards, you can use this map to look up the reflect.Type of the type you want to create and use reflect.New to get a pointer to a new object of that type (stored as a reflect.Value). You can extract the object into an interface with something like this:
reflect.New(yourtype).Elem().Interface()
Elem() will de-reference the pointer and Interface() will return the reflected value as an interface{}
. See The Laws of Reflection for further details.
PS: There might be a better way to structure your program which doesn't even require reflection and which let the compiler catch more errors. Have you considered using a factory method for example? An other easy solution might be to maintain a map[string]func() interface{}
of functions which can be invoked to create a new object with that name.
http://mikespook.com/2012/07/%E5%9C%A8-golang-%E4%B8%AD%E7%94%A8%E5%90%8D%E5%AD%97%E8%B0%83%E7%94%A8%E5%87%BD%E6%95%B0/
但这里有一个限制:这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。
如果想要用这个方法实现调用不同函数原型的函数,需要用到 interface{}。
***********参考*****************
1. https://www.socketloop.com/tutorials/golang-fix-type-interface-has-no-field-or-no-methods-and-type-assertions-example
Golang : Fix type interface{} has no field or no methods and type assertions example
2. golang用字符串反射实例化结构体
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{}}
3. http://stackoverflow.com/questions/17507697/dry-out-my-go-function-with-interfaces
kinds := map[string]func() Entity { "user": func() Entity { return &User{} }, "space": func() Entity { return &Space{} }, "room": func() Entity { return &Room{} },}func Create(kind string) { instance := kinds[kind]() decoder.Decode(instance) saveEntity(instance)}
4. 新手求解 golang 动态new struct
http://www.oschina.net/question/1388294_141504?sort=default&p=2#answers
<span style="font-size:14px;">我现在是这样做的var ModelObj map[string]interface{} = map[string]interface{}{"Member": new(Member), } func GetModObj(mod string) interface{} { if ModelObj[mod] != nil { return ModelObj[mod] } else { return nil } } </span>
5. http://stackoverflow.com/questions/13856539/how-do-you-get-struct-value-on-unknown-interface
- golang 动态 实例化 结构体
- golang初始化结构体
- Golang结构体分析
- 原 golang 结构体
- Golang json转结构体
- Golang结构体和指针
- Rust golang之结构体
- Golang从入门到精通(十四):Golang结构体
- 跟着猫哥学Golang[6] - 结构体
- Golang中结构体转byte数组
- Golang学习笔记 结构体和指针
- golang中结构体转成xml格式
- Golang教程:(十六)结构体
- golang 空结构体struct{}解析
- golang结构体struct学习笔记
- Golang语言社区--结构体数据排序
- golang 工程目录结构
- golang项目结构日记
- actionSheet和从相册选取图片
- nodejs的N个tip
- STL之remove算法详解
- Habber - IOS XMPP 客户端 教程 (续)对方输入状态显示
- CentOS系统中安装chrome浏览器
- golang 动态 实例化 结构体
- FCoE,DCB
- C# 读取ini配置文件
- Java访问修饰符
- C#随机验证码
- 天地图导入AndroidStuido中
- iOS面试题9
- 自动化管理工具Saltstack之文件管理(7)
- iOS 学习 之 gcd