RT, 比如我有一个文件夹 /commands
里面有一堆工具脚本, 我怎么可以动态来调用?
通过cli
调用,输入/commands
里结构体的名字,可以动态调用这个结构体的方法
import
然后init
调用,语法直接不支持commands
每一个结构体实现接口, 最后通过接口去调用, 谁知 golang 居然不支持字符串的反射,说实话有点鸡肋了.搜了一下帖子,说是在外部注册一个全局 map 类,不过这样做还是有缺陷不是我想要的那种.
有写过类似服务的大神, 指点两招
1
virusdefender 2020-06-14 16:20:43 +08:00
既然 golang 了,就别考虑这种问题了,还有两个办法
1. 每个 command 中的 init 中自己去修改注册的 map,而不是在一个地方引用所有的 command 2. go generate 写个脚本扫描一下,然后生成一个 go 文件 |
2
DavidNineRoc OP @virusdefender 如果注册的 command 和要运行的不在同一个项目该怎么处理.
如果有一个服务 a, 类似 gofmt, 然后需要调用 command 里的所有命令. 方法 2 破坏代码管理,生成新的东西. |
3
SingeeKing 2020-06-14 20:15:57 +08:00 via iPhone
编译型语言都不行吧,除非内置一个编译器在运行时编译;一个可行的思路是把每个 /commands 文件分开编译成动态链接库,然后调用这些编译好的 dll 或者 so 文件是可以的
|
4
dcalsky 2020-06-14 20:17:54 +08:00 via Android
用 rpc 通信即可。
|
5
ihidchaos 2020-06-14 21:33:23 +08:00
MethodByName 这样子反射呢
https://www.cnblogs.com/52php/p/6337420.html |
6
DavidNineRoc OP @SingeeKing 编译语言会所有函数加载到一个函数表吗?然后靠函数的名字调用不.
@dcalsky 限制了用户类型,想做一个工具类的东西 @ihidchaos 不足,都实例化了那个结构体, 要是实例化的结构体, golang 内置的反射够调用方法了, 现在是实例化不了结构体 |
7
locoz 2020-06-15 14:22:32 +08:00
工具脚本?都是 Go 写的?你想的是那个文件夹下放的都是.go 文件,然后用一个编译好的 go 程序去动态地调用?还是说文件夹里是一堆编译好的 Go 程序?
|
8
DavidNineRoc OP @locoz 用 golang 写一个工具,编译好的放入 go bin 目录. 然后去调用其它项目里的 commands 文件夹下的 .go 文件
|