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

  • 相关阅读:
    c++的输入流基础知识
    用英文加优先级来解读C的声明
    django 用imagefiled访问图片
    关于Django中的表单验证
    c#语言的一些复习
    IIS发布的网站用localhost可以访问,改成IP就无法访问的解决方案 .
    首次关于IIS配置遇到的一些问题
    常见dos操作
    vs2012中对于entity framework的使用
    几个知识点
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/13648071.html
Copyright © 2011-2022 走看看