golang 有没有更动态化,更强大的反射?

2020-06-14 16:16:24 +08:00
 DavidNineRoc

RT, 比如我有一个文件夹 /commands 里面有一堆工具脚本, 我怎么可以动态来调用?

实际效果

通过cli调用,输入/commands里结构体的名字,可以动态调用这个结构体的方法

搜了一下帖子,说是在外部注册一个全局 map 类,不过这样做还是有缺陷不是我想要的那种.


有写过类似服务的大神, 指点两招

2326 次点击
所在节点    问与答
8 条回复
virusdefender
2020-06-14 16:20:43 +08:00
既然 golang 了,就别考虑这种问题了,还有两个办法

1. 每个 command 中的 init 中自己去修改注册的 map,而不是在一个地方引用所有的 command
2. go generate 写个脚本扫描一下,然后生成一个 go 文件
DavidNineRoc
2020-06-14 20:10:59 +08:00
@virusdefender 如果注册的 command 和要运行的不在同一个项目该怎么处理.
如果有一个服务 a, 类似 gofmt, 然后需要调用 command 里的所有命令.

方法 2 破坏代码管理,生成新的东西.
SingeeKing
2020-06-14 20:15:57 +08:00
编译型语言都不行吧,除非内置一个编译器在运行时编译;一个可行的思路是把每个 /commands 文件分开编译成动态链接库,然后调用这些编译好的 dll 或者 so 文件是可以的
dcalsky
2020-06-14 20:17:54 +08:00
用 rpc 通信即可。
ihidchaos
2020-06-14 21:33:23 +08:00
MethodByName 这样子反射呢
https://www.cnblogs.com/52php/p/6337420.html
DavidNineRoc
2020-06-15 13:32:45 +08:00
@SingeeKing 编译语言会所有函数加载到一个函数表吗?然后靠函数的名字调用不.
@dcalsky 限制了用户类型,想做一个工具类的东西
@ihidchaos 不足,都实例化了那个结构体, 要是实例化的结构体, golang 内置的反射够调用方法了, 现在是实例化不了结构体
locoz
2020-06-15 14:22:32 +08:00
工具脚本?都是 Go 写的?你想的是那个文件夹下放的都是.go 文件,然后用一个编译好的 go 程序去动态地调用?还是说文件夹里是一堆编译好的 Go 程序?
DavidNineRoc
2020-06-16 08:37:19 +08:00
@locoz 用 golang 写一个工具,编译好的放入 go bin 目录. 然后去调用其它项目里的 commands 文件夹下的 .go 文件

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

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

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

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

© 2021 V2EX