2020-10-02:golang如何写一个插件?

举报
福大大架构师每日一题 发表于 2020/10/02 17:31:37 2020/10/02
【摘要】 福哥答案2020-10-02:#福大大架构师每日一题#简单回答:buildmode=plugin plugin.Openp.Lookup[中级回答:](https://www.zhihu.com/question/423802485)golang的plugin是使用-buildmode=plugin 的编译flag编译出的软件包,用于生成共享库(.so)库文件。 Go包中导出的函数和变量显示...

福哥答案2020-10-02:#福大大架构师每日一题#

简单回答:

buildmode=plugin 

plugin.Open

p.Lookup


[中级回答:](https://www.zhihu.com/question/423802485)

golang的plugin是使用-buildmode=plugin 的编译flag编译出的软件包,用于生成共享库(.so)库文件。 Go包中导出的函数和变量显示为ELF符号,可以在另一个golang程序中使用golang中的`plugin`包在运行时查找和绑定它们。

先写这样一段plugin代码:


```go

package main


import "fmt"


// 包含一个简单函数的模块

func Add(a int, b int) int {

    fmt.Printf("\nAdding a=%d and b=%d", a, b)

    return a + b

}

```


用下面的指令编译成plugin:

go build -buildmode=plugin -o math.so


然后可以在另外一个golang代码中加载并调用编译好的plugin:


```go

// 加载plugin

plugins, err := filepath.Glob("math.so")

if err != nil {

    panic(err)

}

fmt.Printf("Loading plugin %s", plugins[0])

p, err := plugin.Open(plugins[0])

if err != nil {

    panic(err)

}


// 查找叫Add的函数

symbol, err := p.Lookup("Add")

if err != nil {

    panic(err)

}

addFunc, ok := symbol.(func(int, int) int)

if !ok {

    panic("Plugin has no 'Add(int)int' function")

}


// 调用函数

addition := addFunc(3, 4)

fmt.Printf("\nAddition is:%d", addition)

```

***

[评论](https://user.qzone.qq.com/3182319461/blog/1601595469)


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。