好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Go Plugins插件的實現方式

Go Plugins插件的實現方式

熱門標簽:武漢百應人工智能電銷機器人 百度地圖標注位置網站 智能語音電銷的機器人 如何利用高德地圖標注家 上海企業外呼系統排名 電腦外呼系統輻射大嗎 揚州電銷外呼系統軟件 開通400電話申請流程 400手機電話免費辦理

官方實現

golang 1.8 及以上版本提供了一個創建共享庫(shared object)的新工具,稱為 Plugins。目前 Plugins 僅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 調用。​

使用示例,定義一個 plugin.go

package main

import (
 "log"
)

func init() {
 log.Println("plugin init")
}

type SayHello struct {
}

func (s *SayHello) CallMe(name string) string {
 log.Println("hello ", name)
 return "I am plugin"
}

// SayHelloPlugin 導出變量
var SayHelloPlugin SayHello

使用 -buildmode=plugin 模式編譯出 plugin.so 共享庫

go build -o plugin.so -buildmode=plugin plugin.go

main.go 中調用插件:

package main

import (
 "log"
 "plugin"
)

type CustomPlugin interface {
 CallMe(name string) string
}

func main() {
 // 打開插件(并發安全)
 p, err := plugin.Open("plugin.so")
 if err != nil {
  panic(err)
 }
 // 在插件中搜索可導出的變量或函數
 sayHelloPlugin, err := p.Lookup("SayHelloPlugin")
 if err != nil {
  panic(err)
 }
 // 斷言插件類型
 if sayHello, ok := sayHelloPlugin.(CustomPlugin); ok {
  log.Println(sayHello.CallMe("togettoyou"))
 }
}
go run main.go

# 輸出
2021/07/28 17:07:21 plugin init
2021/07/28 17:07:21 hello  togettoyou
2021/07/28 17:07:21 I am plugin

定義一個插件總結:

  • package 包名需要定義為 main
  • 必須有可導出的變量或函數
  • 不需要 main 函數
  • 插件加載時會先執行 init 函數

Traefik Yaegi 實現

Yaegi 是 Traefik 開源的 Go 解釋器。Traefik 自身的插件實現就是使用的 Yaegi 。​

Yaegi 運行在 Go 運行時之上,可以直接作為嵌入式解釋器,或使用交互式 shell ,解釋運行 Go 代碼。不過只支持 Go 1.15 和 Go 1.16(最新的 2 個主要版本)。

創建代碼目錄結構如下:

│  go.mod
│  go.sum
│  main.go
│
└─plugin
    └─src
        └─hello
                go.mod
                hello.go

這里有個注意點,Yaegi 的插件需要放在 src 目錄下。​

其中 hello.go 代碼:

package hello

import (
 "fmt"
)

func init() {
 fmt.Println("hello plugin init")
}

func CallMe(msg string) string {
 fmt.Println(msg)
 return "I am plugin"
}

main.go 代碼:

package main

import (
 "fmt"
 "github.com/traefik/yaegi/interp"
 "github.com/traefik/yaegi/stdlib"
)

func main() {
 // 初始化解釋器
 i := interp.New(interp.Options{GoPath: "./plugin/"})

 // 插件需要使用標準庫
 if err := i.Use(stdlib.Symbols); err != nil {
  panic(err)
 }

 // 導入 hello 包
 if _, err := i.Eval(`import "hello"`); err != nil {
  panic(err)
 }

 // 調用 hello.CallMe
 v, err := i.Eval("hello.CallMe")
 if err != nil {
  panic(err)
 }
 callMe := v.Interface().(func(string) string)
 fmt.Println(callMe("togettoyou"))
}
go run main.go

# 輸出
hello plugin init
togettoyou
I am plugin

到此這篇關于Go Plugins插件的實現方式的文章就介紹到這了,更多相關Go Plugins插件內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 成功安裝vscode中go的相關插件(詳細教程)
  • VSCode配置Go插件和第三方拓展包的詳細教程
  • VSCode必裝Go語言以下插件的思路詳解
  • 解決vscode中golang插件依賴安裝失敗問題
  • 使用jQuery.Qrcode插件在客戶端動態生成二維碼并添加自定義Logo

標簽:張掖 黑龍江 江西 宜賓 嘉峪關 延邊 新余 武漢

巨人網絡通訊聲明:本文標題《Go Plugins插件的實現方式》,本文關鍵詞  Plugins,插件,的,實現,方式,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go Plugins插件的實現方式》相關的同類信息!
  • 本頁收集關于Go Plugins插件的實現方式的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 高h肉辣文黄蓉| 男女搞b免费视频| 美女制服诱惑| 国产女洗澡A片AAAA毛片| 国产三级午夜理伦三级| 国产中的精品一区的| 重口婴交h小黄文| 伦理一区二区三区| 老师洗澡让我吃奶羞羞漫画| 日本爽快片18免费久久| 中文字幕第80页| 3233影片| 浪荡女和野男人h| 俄罗斯一级A片免费播放| 天美十大最美女演员| 男人的天堂色偷偷之色偷偷| 草蜢日本在线观看| 半夜他用劲挺进我的身体| 偷拍大众女澡堂洗澡com| 爽?好多水?快?添奶头视频| 肌肌对肌肌免费30分的| 精品久久久久久久久久久院品网| 30分钟激励小视频| 久久久日韩欧美综合影院| 殴美老熟女XXX性506070| 国产精品久久久久久漫画软件| 欧美一级淫片a免费播放口aaa| 赤坂丽巜女囚犯做爰A片| 韩国爱情a级在线电影| 白嫩的18sex少妇HD| 亚洲精品一区二区二区的游戏情况 | 女人又爽?又黄?免费俄罗斯| 国产精品久久久久久久久久久久| 中文字幕日产精品无线码| 91精品婚内出轨bd在线| 九七婷婷狠狠成人免费视频| 美女图片禁欲系高级感| 他扒开我内裤强吻我下面视频,| jm漫画网页版入门| 欧美综合色区| 色喔喔|