golang 如何动态创建struct

如题: 如果我有一个struct


type test struct{
Name string
Sex int
}

func main(){
str := "tset" // 这里的test 可以是我在form 表单里面传递过来的一个数据
obj := new(str) // 请问一下,有没有什么办法可以实现我这样的???
}
已邀请:

sryan - backmir

赞同来自: xiayf davidcai1993 silentred andylau004

静态语言貌似不能直接实现
可以自己实现个map[string]func(string)interface{}
将要动态生成的结构体的函数注册上去
通过string来调用相应的函数来获取对应的结构体

chenqinghe - Gopher/PHPer

赞同来自: astaxie happy godonggua andylau004

var obj interface{}

switch ...{
case "test":
obj = test{}
case "test2":
obj = test2{}
default:
fmt.Println("mismatched.")

}

这样吧,既可以过滤表单输入,也可以达到“动态”创建的效果。

leiyonglin

赞同来自: chenqinghe wuxu92 小强

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))
}

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字符串

要回复问题请先登录注册