Go Plugins外掛程式的實現方式

2022-09-21 02:54:07 字數 2064 閱讀 2557

golang 1.8 及以上版本提供了乙個建立共享庫(shared object)的新工具,稱為 plugins。目前 plugins 僅在 linux、freebsd 和 macos 上受支援,且只支援 golang 呼叫。​

使用示例,定義乙個plugin.go:

package main

import (

"log"

)func init()

type sayhello struct

func (s *sayhello) callme(name string) string

// 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 cus程式設計客棧tomplugin inte***ce

func main()

// 在外掛程式中搜尋可匯出的變數或函式

sayhelloplugin, err := p.lookup("sayhelloplugin")

if err != nil

// 斷言外掛程式型別

if sayhello, ok := sayhelloplugin.(customplugin); ok

}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

定義乙個外掛程式總結:

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**:

// 外掛程式需要使用標準庫

if err := i.use(stdlib.symbols); err != nil

// 匯入 hello 包

if _, err := i.eval(`import "hello"`); err != nil

// 呼叫 hello.callme

v, err := i.eval("hello.callme")

if err != nil

callme := v.inte***ce().(func(string) string)

fmt.println(callme("togettoyou"))

}go run main.go

# 輸出

hello plugin init

togettoyou

i am plugin

外掛程式化之外掛程式Service 新的Hook方法

本文同步自wing的地方酒館 給大家分享乙個新的hook外掛程式service的方法,與activity替換類似,可以先在androidmanifest.xml預留乙個service,然後通過intent啟動,並且將真正的service的classname傳遞過去。可是service沒有涉及到ins...

三方 9 外掛程式化

一 外掛程式化需解決的問題 1 外掛程式dex載入問題 通過反射拿到dexclassloader,解析外掛程式dex與宿主dex合併後,重新插入宿主dexpathlist中。2 外掛程式元件生命週期問題 提前佔坑註冊 元件,在校驗前儲存真實跳轉資訊,利用 元件通過系統校驗,校驗後攔截h跳轉,取出資訊...

flask資料遷移之第三方外掛程式實現

由於flask是基於輕量級的框架,沒有向django那麼龐大的功能,因此,其本身無法實現django那種migrate資料遷移的方式,鑑於此,flask可以採用第三方的擴充套件元件來實現。需要新增兩個元件flask script flask migrate 新增指令碼外掛程式,在指令碼外掛程式新增指...