今天看到 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 11:13:07 +08:00
go 编译完是 exe ,不能动态加载 class……
|
7
Buges 2021-11-29 13:03:58 +08:00 via Android
go 的运行时没有元数据。
你说的那种字符串动态调用得有元数据才能实现,一般这样的语言( Java 、c#等)非常容易反编译就是因为元数据的原因。 |