利用Go Plugin實現(xiàn)插件化編程的簡單方法
前言
說到插件這個東西,很多人都不陌生,一般來說,插件化有幾個好處,一個是增加程序擴展性,豐富功能。另外,還可以實現(xiàn)熱更新,有些大型應(yīng)用,動輒幾個GB的安裝程序,如果一個小小的更新就需要重新下載整個程序,這時候我們就可以把經(jīng)常更新的模塊插件化,這樣更新的時候只需要下載一個小更新文件。比如說平時咱們Chrome瀏覽器都會裝一些插件,可以擴展瀏覽器實現(xiàn)更多的功能,還能靈活的安裝卸載。
Golang在1.8版本之后提供了一個 Plugin 的機制,可以動態(tài)的加載so文件,實現(xiàn)插件化,雖然并不是非常成熟,但是在特定的情況下還是非常好用。
Currently plugins are only supported on Linux, FreeBSD, and macOS.
1.快速開始
插件代碼和普通代碼沒什么區(qū)別,只是在編譯的時候不一樣,但是要求是必須只有一個main包
package main
var Name = "Plugin Name"
func GetName() string {
return Name
}
使用go build -buildmode=plugin編譯,會得到一個so文件,怎么使用這個文件呢?
很簡單,分三步:
1.先打開so文件,如果一個插件已經(jīng)被打開了,那么會返回已存在的plugin
2.使用Lookup查找需要調(diào)用的變量或者函數(shù),名字必須大寫開頭
3.斷言后調(diào)用
func main() {
//打開加載插件,參數(shù)是插件的存儲位置,可以是相對路徑
open, err := plugin.Open("/home/jwang/Documents/plg.so")
if err != nil {
panic(err)
}
//查找標識符
lookup, err := open.Lookup("GetName")
if err != nil {
panic(err)
}
res := lookup.(func() string)()
fmt.Printf("%v\n", res)
name, err := open.Lookup("Name")
if err != nil {
panic(err)
}
fmt.Printf("%v\n", *name.(*string))
}
從上面的代碼可以看到,插件的使用方式非常樸實無華,簡單易懂。
一般來說,為了實現(xiàn)插件化,可以事先定義好一些接口,然后由插件去實現(xiàn)這些接口,這樣才能保證一致性,但是接口的定義不能寫在插件包或者調(diào)用包里面。這時候就需要定義一個專門的公共包,把接口的定義寫在里面,這樣插件包和調(diào)用包都可以引用。
2.注意事項
之所以說這個插件方案不成熟,主要是由于主程序和插件程序之間存在很強的依賴性,比如:
1.編譯的GO版本必須完全一致
2.雙方依賴的公共第三方庫版本必須完全一致
3.GOPATH也得保持一致,這一點可以在編譯時候使用trimpath參數(shù)解決
4.插件加載之后無法卸載
這些問題短時間內(nèi)好像官方也沒有解決的意思,或者說無法解決??傊?,Go plugin目前的應(yīng)用很少,畢竟作為網(wǎng)絡(luò)編程語言,在容器化大行其道的環(huán)境下,更新程序是一件很輕松的事情,除非有特殊需要。
總結(jié)
到此這篇關(guān)于利用Go Plugin實現(xiàn)插件化編程的文章就介紹到這了,更多相關(guān)Go Plugin插件化編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實例詳解
這篇文章主要為大家介紹了Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
Go map底層實現(xiàn)與擴容規(guī)則和特性分類詳細講解
這篇文章主要介紹了Go map底層實現(xiàn)與擴容規(guī)則和特性,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03
Golang 語言極簡類型轉(zhuǎn)換庫cast的使用詳解
本文我們通過 cast.ToString() 函數(shù)的使用,簡單介紹了cast 的使用方法,除此之外,它還支持很多其他類型,在這沒有多多介紹,對Golang 類型轉(zhuǎn)換庫 cast相關(guān)知識感興趣的朋友一起看看吧2021-11-11
go?zero微服務(wù)實戰(zhàn)處理每秒上萬次的下單請求
這篇文章主要為大家介紹了go?zero微服務(wù)實戰(zhàn)處理每秒上萬次的下單請求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07

