Golang Go语言中如何动态创建结构体实例
PHP 版本这样:
public function factory ($string ) {
reutnr new $string
}
而 GO 版本还得预定义,我是这样
func GetInstance (str string ) reflect.Value {
var typeRegistry = make (map[string]reflect.Value )
typeRegistry["xxx"] = reflect.ValueOf (&XXX{})
// ... 有多少这样就有预定义多少
return typeRegistry[str].MethodByName ("GetData")
}
Golang Go语言中如何动态创建结构体实例
更多关于Golang Go语言中如何动态创建结构体实例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
没办法, go 语言本身没有统计代码里所有的类型和名称
要不就用 go generate ,编译时自动产生“预定义”的代码
更多关于Golang Go语言中如何动态创建结构体实例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
也只能这样,正在看 go generate 。
直接 new 一个结构体不就好了么。怎么还用到反射?是我没看懂问题?
Go 语言本来就是静态编译型语言,你这么做肯定 DT ,就和你要求 PHP 在运行前类型检查一样 DT
在Golang中,虽然不像一些动态语言(如Python、JavaScript)那样可以直接在运行时动态定义新的结构体类型,但我们可以通过一些技巧来实现动态创建结构体实例的效果。
一种常见的方法是使用反射(reflect包)和结构体标签(struct tags)。你可以先定义一个包含所有可能字段的通用结构体,并使用map或struct tag来标识哪些字段是实际需要的。然后,通过反射机制来动态地设置这些字段的值。
例如,你可以定义一个包含所有可能字段的“大”结构体,并使用一个配置或JSON对象来指定哪些字段应该被填充值。接下来,利用反射遍历这个配置对象,并根据字段名在“大”结构体中找到对应的字段,然后设置其值。
此外,如果你知道可能会用到的所有结构体类型,但不确定在运行时会使用哪一个,你可以使用接口和类型断言来动态处理不同的结构体类型。这种方法需要在编译时知道所有可能的类型。
还有一种更高级的方法是使用代码生成工具(如protoc-gen-go用于Protocol Buffers,或者jsonschema2go等),这些工具可以根据模式或定义文件自动生成Golang代码,包括结构体定义和必要的序列化/反序列化代码,从而在一定程度上实现“动态”创建结构体实例的效果。
总之,虽然Golang不支持直接动态定义结构体类型,但通过反射、接口和代码生成等技术,我们可以实现类似的功能。