V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
DavidNineRoc
V2EX  ›  问与答

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

  •  
  •   DavidNineRoc · 2020-06-14 16:16:24 +08:00 · 2316 次点击
    这是一个创建于 1405 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    实际效果

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

    • 想通过动态import然后init调用,语法直接不支持
    • commands每一个结构体实现接口, 最后通过接口去调用, 谁知 golang 居然不支持字符串的反射,说实话有点鸡肋了.

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


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

    8 条回复    2020-06-16 08:37:19 +08:00
    virusdefender
        1
    virusdefender  
       2020-06-14 16:20:43 +08:00
    既然 golang 了,就别考虑这种问题了,还有两个办法

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

    方法 2 破坏代码管理,生成新的东西.
    SingeeKing
        3
    SingeeKing  
       2020-06-14 20:15:57 +08:00 via iPhone
    编译型语言都不行吧,除非内置一个编译器在运行时编译;一个可行的思路是把每个 /commands 文件分开编译成动态链接库,然后调用这些编译好的 dll 或者 so 文件是可以的
    dcalsky
        4
    dcalsky  
       2020-06-14 20:17:54 +08:00 via Android
    用 rpc 通信即可。
    ihidchaos
        5
    ihidchaos  
       2020-06-14 21:33:23 +08:00
    MethodByName 这样子反射呢
    https://www.cnblogs.com/52php/p/6337420.html
    DavidNineRoc
        6
    DavidNineRoc  
    OP
       2020-06-15 13:32:45 +08:00
    @SingeeKing 编译语言会所有函数加载到一个函数表吗?然后靠函数的名字调用不.
    @dcalsky 限制了用户类型,想做一个工具类的东西
    @ihidchaos 不足,都实例化了那个结构体, 要是实例化的结构体, golang 内置的反射够调用方法了, 现在是实例化不了结构体
    locoz
        7
    locoz  
       2020-06-15 14:22:32 +08:00
    工具脚本?都是 Go 写的?你想的是那个文件夹下放的都是.go 文件,然后用一个编译好的 go 程序去动态地调用?还是说文件夹里是一堆编译好的 Go 程序?
    DavidNineRoc
        8
    DavidNineRoc  
    OP
       2020-06-16 08:37:19 +08:00
    @locoz 用 golang 写一个工具,编译好的放入 go bin 目录. 然后去调用其它项目里的 commands 文件夹下的 .go 文件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   946 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:51 · PVG 03:51 · LAX 12:51 · JFK 15:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.