创建plugin_1.go&编译
package main
import "fmt"
func Greet(name string) {
fmt.Println("Hello", name)
}
go build -buildmode=plugin -o xxxx.so plugin_1.go
加载和使用这个plugin:
package main
import (
"plugin"
"log"
)
func main() {
p, err := plugin.Open("xxxx.so")
if err != nil {
log.Fatal(err)
}
greet, err := p.Lookup("Greet")
if err != nil {
log.Fatal(err)
}
greet.(func(string))("Go")
}
高级用法
首先,我们创建一个路由处理器作为插件:
// plugin_code.go
package main
import "net/http"
func LoadRoute(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("俺是plugin路由"))
}
var Route http.HandlerFunc = LoadRoute
编译这段代码为插件:
go build -buildmode=plugin -o new_route.so plugin_code.go
然后在Web服务器中动态加载这个插件:
// main.go
package main
import (
"net/http"
"plugin"
)
func main() {
// 加载插件
p, err := plugin.Open("new_route.so")
if err != nil {
panic(err)
}
// 查找插件中的Route变量
route, err := p.Lookup("Route")
if err != nil {
panic(err)
}
// 断言Route的类型并使用它作为HTTP处理器
http.HandleFunc("/new-route", route.(func(http.ResponseWriter, *http.Request)))
// 启动HTTP服务器
http.ListenAndServe(":8080", nil)
}