Go plugin

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

posted @   朝阳1  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示