zoukankan      html  css  js  c++  java
  • golang plugin插件的使用

    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() 

  • 相关阅读:
    将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片
    <bean:wirte>的用法
    bean标签库Struts标签库
    <bean:write/>标签的format属性
    ByteArrayOutputStream和ByteArrayInputStream详解
    <bean:write>的用法
    FLASH寿命测试!
    波特率,kbps,Mbps含义
    printf()函数是格式化输出!
    Qt学习Qt中的C++
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/13648071.html
Copyright © 2011-2022 走看看