请问 go 的反射 是不是必须要先有一个明确的结构体?

2021-11-29 10:24:33 +08:00
 Joker123456789

今天看到 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 是函数名

这种情况,我想通过这个字符串 执行对应的函数,该怎么操作?

2406 次点击
所在节点    Go 编程语言
8 条回复
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)
```
Joker123456789
2021-11-29 10:51:51 +08:00
@sun522198558

非常感谢你的解答,

但是我看了一下,发现这种方式 只是把 [var demo= &Demo {}] 这句复杂化了一下,我是直接定义的,你是定义后放入 map ,然后从 map 取,没有从根本上解决问题。

不过我还是非常感谢你,谢谢。
keepeye
2021-11-29 10:54:53 +08:00
go 并没有内置存储包、函数的全局 map ,你必须自己定义一个 map ,把你那些函数都存到 map 里面再配合 reflect 调用。。
Joker123456789
2021-11-29 10:57:19 +08:00
@keepeye 额,好吧,谢谢
bankroft
2021-11-29 11:11:10 +08:00
考虑一下用 plugin
fgwmlhdkkkw
2021-11-29 11:13:07 +08:00
go 编译完是 exe ,不能动态加载 class……
Buges
2021-11-29 13:03:58 +08:00
go 的运行时没有元数据。
你说的那种字符串动态调用得有元数据才能实现,一般这样的语言( Java 、c#等)非常容易反编译就是因为元数据的原因。
liuhan907
2021-11-29 22:01:45 +08:00
@Buges Go 有元数据,只是不公开给开发者而已。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/818658

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX