V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
chuhades
V2EX  ›  Go 编程语言

Go 如何动态调用函数?

  •  
  •   chuhades ·
    Q2h1Cg · 2015-11-23 18:57:43 +08:00 · 1830 次点击
    这是一个创建于 3280 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目需求是通过 golang 编写一 framework (看重 go 的高并发), framework 为插件化,某一包(目录)下放置插件,插件更新频率很高。问题是,在不知道插件名(文件名)的情况下怎样才能动态的调用插件?没有找到怎么用 go 实现.. 现在的想法是插件用 python 开发,然后 go 遍历插件目录进行调用。
    忘指教
    11 条回复    2016-03-17 15:01:56 +08:00
    mengzhuo
        1
    mengzhuo  
       2015-11-23 19:03:13 +08:00
    go 是静态语言!!!是需要编译的!!!是不能更改运行时的!!

    只能用父进程监控文件变化,重新编译,杀掉原有子进程,然后启动。
    chuhades
        2
    chuhades  
    OP
       2015-11-23 19:03:48 +08:00
    或者问题可以转化成:怎么获取一个包中的所有 struct ?
    Zzzzzzzzz
        3
    Zzzzzzzzz  
       2015-11-23 19:10:47 +08:00
    go 插件编译成动态链接库暴露固定的接口, 主程序里通过 cgo 用 dlopen 、 dlsym 这些调用这个接口, 但是感觉会不会太坑.....
    moro
        4
    moro  
       2015-11-23 20:37:07 +08:00
    反射可以实现。
    chuhades
        5
    chuhades  
    OP
       2015-11-23 21:02:14 +08:00
    @moro 我 google 了下 不能反射包呀?
    Unknwon
        6
    Unknwon  
       2015-11-23 21:03:34 +08:00
    如果你可以实现知道哪些函数要被执行,可以用字符串查找来通过反射执行。。
    ksword
        7
    ksword  
       2015-11-23 21:09:10 +08:00
    go 是静态编译的,不适合实现插件机制,或集成 lua 试下: https://github.com/yuin/gopher-lua
    moro
        8
    moro  
       2015-11-23 22:06:14 +08:00
    包必须要先引入。
    jybox
        9
    jybox  
       2015-11-23 22:34:40 +08:00
    https://golang.org/pkg/reflect/ 反射模块可以提供一定程度上的运行时类型信息
    chai2010
        10
    chai2010  
       2015-11-24 09:38:59 +08:00
    做成 dll
    456vv
        11
    456vv  
       2016-03-17 15:01:56 +08:00
    四种好用的方法: 1 , RPC 。 2 , template 。 3 , reflect 。 4 , http
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:39 · PVG 05:39 · LAX 13:39 · JFK 16:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.