主頁(yè) > 知識(shí)庫(kù) > Go Plugins插件的實(shí)現(xiàn)方式

Go Plugins插件的實(shí)現(xiàn)方式

熱門標(biāo)簽:武漢百應(yīng)人工智能電銷機(jī)器人 百度地圖標(biāo)注位置網(wǎng)站 智能語(yǔ)音電銷的機(jī)器人 如何利用高德地圖標(biāo)注家 上海企業(yè)外呼系統(tǒng)排名 電腦外呼系統(tǒng)輻射大嗎 揚(yáng)州電銷外呼系統(tǒng)軟件 開通400電話申請(qǐng)流程 400手機(jī)電話免費(fèi)辦理

官方實(shí)現(xiàn)

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

使用示例,定義一個(gè) 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 導(dǎo)出變量
var SayHelloPlugin SayHello

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

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

main.go 中調(diào)用插件:

package main

import (
 "log"
 "plugin"
)

type CustomPlugin interface {
 CallMe(name string) string
}

func main() {
 // 打開插件(并發(fā)安全)
 p, err := plugin.Open("plugin.so")
 if err != nil {
  panic(err)
 }
 // 在插件中搜索可導(dǎo)出的變量或函數(shù)
 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

定義一個(gè)插件總結(jié):

  • package 包名需要定義為 main
  • 必須有可導(dǎo)出的變量或函數(shù)
  • 不需要 main 函數(shù)
  • 插件加載時(shí)會(huì)先執(zhí)行 init 函數(shù)

Traefik Yaegi 實(shí)現(xiàn)

Yaegi 是 Traefik 開源的 Go 解釋器。Traefik 自身的插件實(shí)現(xiàn)就是使用的 Yaegi 。​

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

創(chuàng)建代碼目錄結(jié)構(gòu)如下:

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

這里有個(gè)注意點(diǎn),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/"})

 // 插件需要使用標(biāo)準(zhǔn)庫(kù)
 if err := i.Use(stdlib.Symbols); err != nil {
  panic(err)
 }

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

 // 調(diào)用 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

到此這篇關(guān)于Go Plugins插件的實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)Go Plugins插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 成功安裝vscode中g(shù)o的相關(guān)插件(詳細(xì)教程)
  • VSCode配置Go插件和第三方拓展包的詳細(xì)教程
  • VSCode必裝Go語(yǔ)言以下插件的思路詳解
  • 解決vscode中g(shù)olang插件依賴安裝失敗問題
  • 使用jQuery.Qrcode插件在客戶端動(dòng)態(tài)生成二維碼并添加自定義Logo

標(biāo)簽:張掖 黑龍江 江西 宜賓 嘉峪關(guān) 延邊 新余 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go Plugins插件的實(shí)現(xiàn)方式》,本文關(guān)鍵詞  Plugins,插件,的,實(shí)現(xiàn),方式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go Plugins插件的實(shí)現(xiàn)方式》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Go Plugins插件的實(shí)現(xiàn)方式的相關(guān)信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章