Golang Go语言中多个相同结构体能实例能不能实现只反射一次获取到一个unbond method后续调用
想对多个结构体都调用相同的方法
但是对所有相同结构体都要做反射性能也有影响
但似乎没法获取到 unbond method
或者说我直接说需求
用 ent orm
现在想把两个相同的库合并到第三个库
我想到的做法是反射 Creae 结构体获取到 Set 字段设置所有属性然后 bulk insert
有没有更好的办法
Golang Go语言中多个相同结构体能实例能不能实现只反射一次获取到一个unbond method后续调用
相同的方法可以用接口
更多关于Golang Go语言中多个相同结构体能实例能不能实现只反射一次获取到一个unbond method后续调用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
ent 代码是动态生成的
是这样?
reflect.TypeOf(foo).Method(0).Func.Call([]reflect.Value{reflect.ValueOf(bar)})
对对对, 我傻掉了老是盯着 reflect.ValueOf
或许可以尝试一下使用自定义模板生成你需要的代码:
https://entgo.io/zh/docs/templates
我也是这样想的 但是模板看半天一头雾水…没用过 golang 的模板
在Go语言中,反射(reflection)机制允许我们在运行时检查变量的类型和值,甚至调用方法。对于多个具有相同结构体的实例,如果你希望仅通过一次反射获取到一个未绑定方法(unbound method)并在后续调用中复用,这是可以实现的,但需要注意一些细节。
首先,通过反射获取结构体类型的方法集,并将方法值(reflect.Value
类型)保存下来。这里的关键是方法值包含了接收者(receiver)的信息,因此你需要为每个实例准备一个特定的接收者来调用这个方法。
步骤如下:
- 使用
reflect.TypeOf
获取结构体的类型。 - 使用
Type.MethodByName
获取方法的reflect.Method
。 - 创建一个方法值,使用
Method.Func.Call
来调用它,并传入实例(作为接收者)和其他参数。
由于方法值需要特定的实例作为接收者,你不能直接保存一个通用的“方法句柄”来调用不同实例的方法。不过,你可以保存一个函数,这个函数接受实例和其他参数,并在内部使用反射调用方法。
这种方法虽然可以实现你的需求,但会引入反射带来的性能开销。如果性能是关键因素,建议考虑其他设计模式,比如接口或代码生成,来避免在运行时使用反射。
总之,虽然技术上可行,但应谨慎使用反射,特别是在性能敏感的代码中。