菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
90
0

golang plugin插件的使用

原创
05/13 14:22
阅读数 85504

 

demo示例:

aplugin.go

package main

func Add(x, y int) int {
	return x + y
}
func Subtract(x, y int) int {
	return x - y
}

  

  创建插件aplugin.so : 

go build -buildmode=plugin -o aplugin.so aplugin.go

test.go

package main

import (
	"fmt"
	"plugin"
)

var (
	ProductObj *plugin.Plugin
)
//编写一个"构造函数"(单例模式,懒汉模式)
func new() *plugin.Plugin {
	if ProductObj == nil {
		ProductObj, _ = plugin.Open("./aplugin.so")
	}
	return ProductObj
}
func AddNum(x, y int) int {
	p := new()
	add, _ := p.Lookup("Add")
	sum := add.(func(int, int) int)(x, y)
	return sum
}

func main() {
	sum := AddNum(11, 2)
	fmt.Print(sum)
}

  

前面的是使用懒汉模式的单例模式,并不是线程安全的,可以用golang的init()来模仿饿汉模式

test.go

package main
 
import (
    "fmt"
    "product"
)
 
 
func main() {
    sum := product.AddNum(11, 2)
    fmt.Print(sum)
}

  

  product.go

package product

import (
	"fmt"
	"plugin"
)
func init(){
        go new()
}
var (
	ProductObj *plugin.Plugin
)
//编写一个"构造函数"(单例模式,懒汉模式)
func new() *plugin.Plugin {
	if ProductObj == nil {
		ProductObj, _ = plugin.Open("./aplugin.so")
	}
	return ProductObj
}
func AddNum(x, y int) int {
	p := new()
	add, _ := p.Lookup("Add")
	sum := add.(func(int, int) int)(x, y)
	return sum
}

 以上代码是线程安全的,因为程序一开始就调用了product 包的init()来执行new。

要理解以上代码需要清楚golang main和init的调用顺序。

其他package的init() > main package包的main > main package包的init() 

发表评论

0/200
90 点赞
0 评论
收藏