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

  • 相关阅读:
    nginx js、css多个请求合并为一个请求(concat模块)
    Web客户端语言HTML、XHTML和XML相关知识介绍
    正则小略
    你可能不知道的5个功能强大的 HTML5 API
    你须知道的30个CSS选择器 »
    css3 media媒体查询器用法总结
    深入java虚拟机学习 -- 类的加载机制
    ElasticSearch和solr的差别
    idea 使用debugger技巧
    vue学习问题总结(一)
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/13648071.html
Copyright © 2020-2023  润新知