前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go: 插件系统

go: 插件系统

作者头像
超级大猪
发布2020-07-14 11:33:25
4310
发布2020-07-14 11:33:25
举报
文章被收录于专栏:大猪的笔记

参考文章: https://toutiao.io/posts/adjoci/preview

闲来无事,今天发现go居然有一个插件系统。 果然是宇宙级的语言。

配置文件

plugconf.yaml

代码语言:javascript
复制
plug:
  lang: "./pluglib/en.so"

load.go 载入插件

代码语言:javascript
复制
package plug

import (
    "github.com/ghodss/yaml"
    "io/ioutil"
    "plugin"
)
import "xxxxxxx/checkerr"

var GlobalGreeter func() string

type Plugconf struct {
    Plug struct {
        Lang string
    }
}

var GlobalPlugconf *Plugconf

func Load() (err error) {
    defer checkerr.MarkPanic(&err)

    // 载入配置文件
    modByte, err := ioutil.ReadFile("./conf/plugconf.yaml")
    checkerr.CheckError(err, "load conf failed", err)
    // 解析配置
    GlobalPlugconf = new(Plugconf)
    err = yaml.Unmarshal(modByte, GlobalPlugconf)
    checkerr.CheckError(err, "marshal yaml failed ", err)

    // 打开插件
    plug, err := plugin.Open(GlobalPlugconf.Plug.Lang)
    checkerr.CheckError(err, "open plug failed", err)

    // 寻找对象
    greeterObj, err := plug.Lookup("Greeter")
    checkerr.CheckError(err, "look up failed ", err)

    // 转换对象的格式
    GlobalGreeter = greeterObj.(func() string)

    return nil
}

func RunGreeter() string {
    return GlobalGreeter()
}

main函数调用

代码语言:javascript
复制
package main

import (
    "fmt"
    "main/plug"
    "time"
)

func main() {
    for {
        err := plug.Load()
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(plug.RunGreeter())
        time.Sleep(time.Second)
    }
}

插件编写

插件需要在main包。比如

ch.go

代码语言:javascript
复制
package main

type greeter struct {
}

func (g *greeter) Greet() string {
    return "世界你好"
}

// 这个就是可导出的函数,插件在lookup这个函数
func Greeter() string {
    return new(greeter).Greet()
}

en.go

代码语言:javascript
复制
package main

type greeter struct {
}

func (g *greeter) Greet() string {
    return "hello world"
}

func Greeter() string {
    return new(greeter).Greet()
}

make插件

插件代码写好后,必须编译为so Makefile

代码语言:javascript
复制
all:lib
lib:
    go build -buildmode=plugin -o ./en.so en.go
    go build -buildmode=plugin -o ./ch.so ch.go
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置文件
  • load.go 载入插件
  • main函数调用
  • 插件编写
    • ch.go
      • en.go
      • make插件
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档