本文记载下了golang插件的用法, 原文:
https://code.tutsplus.com/tutorials/writing-plugins-in-go--cms-29101
这个例子使用了两个排序: 快速排序和冒泡排序,不追求算法的高效,只为了说明插件的生成和使用。
而且只在linux下,build和运行.(windows环境没有测试过, 原文在windows下要使用docker)
目录:
plugins
├── bubble_sort
│ └── bubble_sort_plugin.go 冒泡排序
├── bubble_sort_plugin.so 编译后的插件
├── quick_sort
│ └── quick_sort_plugin.go 快速排序
├── quick_sort_plugin.so 编译后的插件
├── sort 编译后的主程序
└── sort.go main()
├── bubble_sort
│ └── bubble_sort_plugin.go 冒泡排序
├── bubble_sort_plugin.so 编译后的插件
├── quick_sort
│ └── quick_sort_plugin.go 快速排序
├── quick_sort_plugin.so 编译后的插件
├── sort 编译后的主程序
└── sort.go main()
bubble_sort_plugin.go
package main func Sort(items []int) *[]int { if len(items) < 2 { return &items } tmp := 0 for i := 0; i < len(items); i++ { for j := 0; j < len(items)-1; j++ { if items[j] > items[j+1] { tmp = items[j] items[j] = items[j+1] items[j+1] = tmp } } } return &items }
quick_sort_plugin.go
package main import "math/rand" func Sort(items []int) *[]int { if len(items) < 2 { return &items } peg := items[rand.Intn(len(items))] below := make([]int, 0, len(items)) above := make([]int, 0, len(items)) middle := make([]int, 0, len(items)) for _, item := range items { switch { case item < peg: below = append(below, item) case item == peg: middle = append(middle, item) case item > peg: above = append(above, item) } } below = *Sort(below) above = *Sort(above) sorted := append(append(below, middle...), above...) return &sorted }
sort.go
package main import ( "fmt" "plugin" "path/filepath" ) func main() { numbers := []int{5,2,7,6,1,3,4,8} all_plugins, err := filepath.Glob("*.so") if err != nil { panic(err) } for _, filename := range (all_plugins) { p, err := plugin.Open(filename) // 加载插件 if err != nil { panic(err) } symbol, err := p.Lookup("Sort") // 查找插件里的指定函数 if err != nil { panic(err) } sortFunc, ok := symbol.(func([]int) *[]int) if !ok { panic("Plugin has no 'Sort([]int) *[]int)' function") } sorted := sortFunc(numbers) // 调用插件函数 fmt.Println(filename, sorted) } }
编译:
编译 bubble_sort_plugin.go:
在bubble_sort目录里:
# go build -buildmode=plugin -o ../bubble_sort_plugin.so
生成的quick_sort_plugin.so在plugins目录里
同样:
在quick_sort目录里:
go build -buildmode=plugin -o ../quick_sort_plugin.so
编译sort.go:
在plugins目录里:
# go build sort.go
生成 sort (绿色,可执行)
执行sort:
# ./sort bubble_sort_plugin.so &[1 2 3 4 5 6 7 8] quick_sort_plugin.so &[1 2 3 4 5 6 7 8]