码迷,mamicode.com
首页 > 其他好文 > 详细

go plugin

时间:2020-12-14 13:16:02      阅读:2      评论:0      收藏:0      [点我收藏+]

标签:nal   inter   fail   time   debug模式   提示   ide   mod   新版本   

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版本是最新版本?还是我哪里出错了?
这里贴出我参考的博客地址:

  1. https://liqiang.io/post/usage-for-plugin-in-go-497f3934
  2. 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的功能,顺便熟悉怎么使用的,以后有机会多用用;
这里前期写代码是没啥问题的,就是后半段测试的时候,出了很多问题。

  1. 我居然用ide的test+debug模式,来做这个单元测试;为什么会这样?因为我上周写了一个命令行的运维工具,不好用main函数直接打断点测试,我就单个的测试了每个函数,用的就是test+debug,惯性思维了!
  2. 对go的命令行工具用的不不熟,一直用IDE,不了解这些工具使用的细节,以后多手敲命令。

go plugin

标签:nal   inter   fail   time   debug模式   提示   ide   mod   新版本   

原文地址:https://www.cnblogs.com/azi-v/p/go-plugin.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!