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