Golang Go语言中请教个方案,关于插件

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中请教个方案,关于插件

go 做 web 感觉是不错,一个问题是,假设已经发布一个版本了,客户只有编译后的程序。

那第三方用户如何集成他的插件进来,而且不用编译?

6 回复

go1.8 后的插件系统似乎可以用,但没有 win.

所以各位有神马更好的方法吗

更多关于Golang Go语言中请教个方案,关于插件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


lua 或者 js 写插件?

内嵌一个 js 解释器

go 在 win 上的 dll 是个巨坑.千万别用.

内嵌一个脚本解释器,不过我认为这是吃苦不讨好的事情,暴露出 API 或者留下 RPC 接口可能是更好的方案

在Go语言中实现插件机制,你可以利用Go的插件包(plugin),它允许动态加载共享库(.so文件,在Windows上是.dll文件)。以下是一个基本的实现方案:

  1. 创建插件: 首先,编写你想要作为插件的代码,并编译成共享库。例如,创建一个名为myplugin.go的文件,其中包含一个导出的函数。

    package main
    
    import "fmt"
    
    func Hello() {
        fmt.Println("Hello from plugin!")
    }
    

    使用以下命令编译成插件:

    go build -buildmode=plugin -o myplugin.so myplugin.go
    
  2. 加载插件: 在你的主程序中,使用plugin包加载这个共享库,并调用其中的函数。

    package main
    
    import (
        "fmt"
        "plugin"
    )
    
    func main() {
        p, err := plugin.Open("myplugin.so")
        if err != nil {
            panic(err)
        }
    
        hello, err := p.Lookup("Hello")
        if err != nil {
            panic(err)
        }
    
        helloFunc, ok := hello.(func())
        if !ok {
            panic("cannot assert type")
        }
    
        helloFunc()
    }
    

这种方法允许你在运行时动态加载和调用插件中的代码。需要注意的是,插件功能有一些限制,比如插件和主程序必须使用相同的Go版本编译,且插件不能包含init函数等。

回到顶部