go plugin
Go的plugin
.so文件的生成
首先创建一个mingTest包,包中创建remainder.go文件
文件内容如下:
package main
import "fmt"
func GetRemainder() {
fmt.Println(150%500)
}
remainder.go文件作为生成动态连接库的源文件;
cd进入remainder.go所在项目的文件夹📁下,使用如下命令生成文件:
go build -buildmode=plugin -o remainder.so remainder.go
注意:这里使用plugin构建模式后,package包名,由remainder包名变成了c
.so文件的使用
加载插件
创建dial.go文件,内容如下:(请参考注释内容)
package remainder
import (
"fmt"
"log"
"plugin"
)
func Dial() {
// 加载插件
p, err := plugin.Open("./remainder.so")
if err != nil {
log.Fatal(err)
}
// 调用插件
GetRemainder, err := p.Lookup("GetRemainder")
if err != nil {
log.Fatal(err)
}
// 使用动态连接库的函数
fmt.Println(GetRemainder.(func(int, int) int)(150, 500))
}
创建测试文件dial_text.go文件
package remainder
import "testing"
func TestDial(t *testing.T) {
Dial()
}
运行测试函数TestDial
这里我使用的是Goland的Debug模式,但是出错
请看:
API server listening at: 127.0.0.1:50711
=== RUN TestDial
2019/12/23 11:11:27 plugin.Open("./remainder"): plugin was built with a different version of package runtime/internal/sys
Debugger finished with exit code 0
为什么会这样?提示我运行时的sys系统版本不一致,是因为我的macOS版本是最新版本❓还是我哪里出错了❓
这里贴出我参考的博客地址:
- https://liqiang.io/post/usage-for-plugin-in-go-497f3934
- http://www.361way.com/go-plugin/5925.html
谷歌搜出来的,有什么办法?感觉又被博客给蒙骗了,🌊浪费了我的宝贵时间。
解决办法,去看权威文档还是继续调试❓
用go的命令行测试工具试试:
go test dial_test.go
用go test命令我没试!突然觉得我自己哪里用的有点不对,嗯嗯!就是为什么go test时还要用Debug模式呢?
我直接用Goland的RUN试了下出结果了,看看:
=== RUN TestDial
150
--- PASS: TestDial (0.00s)
PASS
Process finished with exit code 0
不行🙅♂️,我还要再试试用go的命令行工具go test试试,看看:
# command-line-arguments [command-line-arguments.test]
./dial_test.go:6:2: undefined: Dial
FAIL command-line-arguments [build failed]
FAIL
😂,结果就这样了!为什么?为什么会这样?
百度一下!看看为什么?因为我的Dial函数和test函数是在同一个包里面的?为什么要说它没有被定义?
简书上说,需要吧被测试文件与测试文件一同编译,也许是对的,一直用IDE也不清楚IDE在运行test时,底层为我们做了什么!
试试:
go test -v dial_test.go dial.go
这里没有把.so文件的源文件remainder.so文件也一同编译,主要考虑的是验证这个.so动态链接库是否能真正的被调用。
-v 参数是展示test的过程,如果不➕-v,你看到的结果只有一个OK而已;
下面贴结果:
chenming@chenmingdeiMac mingTest % go test -v dial_test.go dial.go
=== RUN TestDial
150
--- PASS: TestDial (0.00s)
PASS
ok command-line-arguments 0.321s
这里贴出来简书的地址:https://www.jianshu.com/p/4cf4fdf33493
感谢这位作者,缩短了我调代码的时间。
补充一下包文件结构:
总结一下
我做这个测试的目标:为了测试go plugin的功能,顺便熟悉怎么使用的,以后有机会多用用;
这里前期写代码是没啥问题的,就是后半段测试的时候,出了很多问题。
- 我居然用ide的test+debug模式,来做这个单元测试;为什么会这样?因为我上周写了一个命令行的运维工具,不好用main函数直接打断点测试,我就单个的测试了每个函数,用的就是test+debug,惯性思维了!
- 对go的命令行工具用的不不熟,一直用IDE,不了解这些工具使用的细节,以后多手敲命令。