用 Go Plugin 构建模块化系统

faunjoe · · 7951 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

自从 golang 1.8以后,提供了一个 Plugin 的机制使得 golang能够加载 so 动态链接库文件。
这样可以对外发布动态链接库而不需要把源码共享给对方去进行编译,还可以做到按需加载相应的插件来实现动态开启插件相应的功能。

官方文档在此:https://golang.org/pkg/plugin/
编写一个 Plugin 基本有以下几步:

1.Plguin 需要有自己的 main package
2.编译的时候,使用 go build -buildmode=plugin file.go 来编译
3.使用 plugin.Open(path string) 来打开.so文件,同一插件只能打开一次,重复打开会报错
4.使用 plugin.LookUp(name string) 来获取插件中对外暴露的方法或者类型
5.使用类型断言,断言后执行相应的方法

main.go

package main

import (
    "fmt"
    "plugin"
)

func main() {

    p, err := plugin.Open("plugin.so")
    if err != nil {
        panic(err)
    }
    m, err := p.Lookup("GetProductBasePrice")
    if err != nil {
        panic(err)
    }
    res := m.(func(int) int)(30)
    fmt.Println(res)
}

plugin.go

package main

import "fmt"

func GetProductBasePrice(basePrice int) int {
    return basePrice + 200
}

注意几点问题:

插件中定义的 struct 无法暴露出来,可以让主程序和插件程序import公共的 package 来解决
私有方法、变量不会被暴露出来

image.png
image.png

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:faunjoe

查看原文:用 Go Plugin 构建模块化系统

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

7951 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传