golang plugin插件的使用

 

demo示例:

aplugin.go

1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

1
2
3
4
5
6
7
8
9
10
11
12
package main
  
import (
    "fmt"
    "product"
)
  
  
func main() {
    sum := product.AddNum(11, 2)
    fmt.Print(sum)
}

  

  product.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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() 

posted @   cs_wu  阅读(1745)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2018-09-10 TCP连接和连接释放(TCP的三次挥手和四次握手)
点击右上角即可分享
微信分享提示