你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
如题: 如果我有一个struct
type test struct{ Name string Sex int } func main(){ str := "tset" // 这里的test 可以是我在form 表单里面传递过来的一个数据 obj := new(str) // 请问一下,有没有什么办法可以实现我这样的??? }
没有找到相关结果
sryan - backmir
赞同来自: xiayf 、davidcai1993 、silentred 、andylau004 、jinheking
静态语言貌似不能直接实现 可以自己实现个map[string]func(string)interface{} 将要动态生成的结构体的函数注册上去 通过string来调用相应的函数来获取对应的结构体
leiyonglin
赞同来自: chenqinghe 、wuxu92 、小强 、mineyouhe 、caoshulin1989 、youEclipse 、KBellX更多 »
Go Playground
package main import ( "fmt" "reflect" ) var typeRegistry = make(map[string]reflect.Type) func registerType(elem interface{}) { t := reflect.TypeOf(elem).Elem() typeRegistry[t.Name()] = t } func newStruct(name string) (interface{}, bool) { elem, ok := typeRegistry[name] if !ok { return nil, false } return reflect.New(elem).Elem().Interface(), true } func init() { registerType((*test)(nil)) } type test struct { Name string Sex int } func main() { structName := "test" s, ok := newStruct(structName) if !ok { return } fmt.Println(s, reflect.TypeOf(s)) t, ok := s.(test) if !ok { return } t.Name = "i am test" fmt.Println(t, reflect.TypeOf(t)) }
chenqinghe
赞同来自: astaxie 、happy 、godonggua 、andylau004
var obj interface{} switch ...{ case "test": obj = test{} case "test2": obj = test2{} default: fmt.Println("mismatched.") }
这样吧,既可以过滤表单输入,也可以达到“动态”创建的效果。
andot - 野生程序员,20年+编程经验,近十年来,全身心专注于 Hprose 开源项目的开发和维护。
赞同来自: godonggua 、andylau004
go 语言没有提供根据类型名称返回类型变量的功能,但是你可以通过设置一个:
var typemap = make(map[string]reflect.Type)
然后把你的结构体注册到这个表中,之后你可以通过这个表通过类型名获取类型,之后用反射创建对象就行了。
xiayf - 程序员,译者,GO、Python、PHP、JS
赞同来自: andylau004
用reflect么?
godonggua - java,go爱好者
赞同来自:
感觉应该是用reflect来解决, 但是reflect动态生成,得知道类型,reflect.Type. reflect.New(type)可以动态生成一个reflect.Value。 得到value了就可以用接口来转换了
func New(typ Type) Value New returns a Value representing a pointer to a new zero value for the specified type. That is, the returned Value's Type is PtrTo(typ).
changjixiong - 时常做白日梦的程序员
t := test{} json.Unmarshal(bytes, &t)
前提是bytes是和这个结构相符的json字符串
qiangmzsx - 痛而不言,笑而不语,迷而不失,惊而不乱。
尽量不要使用反射,性能不好而且会比较复杂
Lampo - Go 服务器开发群:84808959
可不可以, 先生成对象池, 然后根据传递的名称去对象池中取对象呢?
要回复问题请先登录或注册
创造、获取、分享、传播和应用Go
9 个回复
sryan - backmir
赞同来自: xiayf 、davidcai1993 、silentred 、andylau004 、jinheking
静态语言貌似不能直接实现 可以自己实现个map[string]func(string)interface{} 将要动态生成的结构体的函数注册上去 通过string来调用相应的函数来获取对应的结构体
leiyonglin
赞同来自: chenqinghe 、wuxu92 、小强 、mineyouhe 、caoshulin1989 、youEclipse 、KBellX更多 »
Go Playground
chenqinghe
赞同来自: astaxie 、happy 、godonggua 、andylau004
这样吧,既可以过滤表单输入,也可以达到“动态”创建的效果。
andot - 野生程序员,20年+编程经验,近十年来,全身心专注于 Hprose 开源项目的开发和维护。
赞同来自: godonggua 、andylau004
go 语言没有提供根据类型名称返回类型变量的功能,但是你可以通过设置一个:
然后把你的结构体注册到这个表中,之后你可以通过这个表通过类型名获取类型,之后用反射创建对象就行了。
xiayf - 程序员,译者,GO、Python、PHP、JS
赞同来自: andylau004
用reflect么?
godonggua - java,go爱好者
赞同来自:
感觉应该是用reflect来解决, 但是reflect动态生成,得知道类型,reflect.Type. reflect.New(type)可以动态生成一个reflect.Value。 得到value了就可以用接口来转换了
func New(typ Type) Value New returns a Value representing a pointer to a new zero value for the specified type. That is, the returned Value's Type is PtrTo(typ).
changjixiong - 时常做白日梦的程序员
赞同来自:
t := test{} json.Unmarshal(bytes, &t)
前提是bytes是和这个结构相符的json字符串
qiangmzsx - 痛而不言,笑而不语,迷而不失,惊而不乱。
赞同来自:
尽量不要使用反射,性能不好而且会比较复杂
Lampo - Go 服务器开发群:84808959
赞同来自:
可不可以, 先生成对象池, 然后根据传递的名称去对象池中取对象呢?