今天看到 go 反射的时候,发现 所有的例子都是这样的
type Demo struts { } func (demo Demo) CallFuncNoArgs (){ }
var demo= &Demo {} reflect.ValueOf(demo).MethodByName("CallFuncNoArgs").Call([]reflect.Value{})
发现这样限制非常大,如果 我想用反射 调用任意函数,怎么办? 比如
var fucnName = "api.getList"
api 是 包名,getList 是函数名
这种情况,我想通过这个字符串 执行对应的函数,该怎么操作?
1 sun522198558 2021-11-29 10:43:39 +08:00 ```go registry := map[string]func() interface{}{ "Demo": func() interface{} { return Demo{} }, } reflect.ValueOf(registry["Demo"]()).MethodByName("CallFuncNoArgs").Call(nil) ``` |
![]() | 2 Joker123456789 OP @sun522198558 非常感谢你的解答, 但是我看了一下,发现这种方式 只是把 [var demo= &Demo {}] 这句复杂化了一下,我是直接定义的,你是定义后放入 map ,然后从 map 取,没有从根本上解决问题。 不过我还是非常感谢你,谢谢。 |
![]() | 3 keepeye 2021-11-29 10:54:53 +08:00 go 并没有内置存储包、函数的全局 map ,你必须自己定义一个 map ,把你那些函数都存到 map 里面再配合 reflect 调用。。 |
![]() | 4 Joker123456789 OP @keepeye 额,好吧,谢谢 |
![]() | 5 bankroft 2021-11-29 11:11:10 +08:00 考虑一下用 plugin |
![]() | 6 fgwmlhdkkkw 2021-11-29 1113:07 +08:00 go 编译完是 exe ,不能动态加载 class…… |
![]() | 7 Buges 2021-11-29 13:03:58 +08:00 via Android go 的运行时没有元数据。 你说的那种字符串动态调用得有元数据才能实现,一般这样的语言( Java 、c#等)非常容易反编译就是因为元数据的原因。 |