Go plugin

发布时间 2023-12-02 09:47:46作者: 朝阳1

创建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)
}