溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么利用Go Plugin實(shí)現(xiàn)插件化編程

發(fā)布時(shí)間:2021-11-01 09:16:37 來(lái)源:億速云 閱讀:133 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么利用Go Plugin實(shí)現(xiàn)插件化編程,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

前言

說(shuō)到插件這個(gè)東西,很多人都不陌生,一般來(lái)說(shuō),插件化有幾個(gè)好處,一個(gè)是增加程序擴(kuò)展性,豐富功能。另外,還可以實(shí)現(xiàn)熱更新,有些大型應(yīng)用,動(dòng)輒幾個(gè)GB的安裝程序,如果一個(gè)小小的更新就需要重新下載整個(gè)程序,這時(shí)候我們就可以把經(jīng)常更新的模塊插件化,這樣更新的時(shí)候只需要下載一個(gè)小更新文件。比如說(shuō)平時(shí)咱們Chrome瀏覽器都會(huì)裝一些插件,可以擴(kuò)展瀏覽器實(shí)現(xiàn)更多的功能,還能靈活的安裝卸載。

Golang在1.8版本之后提供了一個(gè) Plugin 的機(jī)制,可以動(dòng)態(tài)的加載so文件,實(shí)現(xiàn)插件化,雖然并不是非常成熟,但是在特定的情況下還是非常好用。

Currently plugins are only supported on Linux, FreeBSD, and macOS.

1.快速開(kāi)始

插件代碼和普通代碼沒(méi)什么區(qū)別,只是在編譯的時(shí)候不一樣,但是要求是必須只有一個(gè)main包

package main

var Name = "Plugin Name"

func GetName() string {
    return Name
}

使用go build -buildmode=plugin編譯,會(huì)得到一個(gè)so文件,怎么使用這個(gè)文件呢?

很簡(jiǎn)單,分三步:

1.先打開(kāi)so文件,如果一個(gè)插件已經(jīng)被打開(kāi)了,那么會(huì)返回已存在的plugin

2.使用Lookup查找需要調(diào)用的變量或者函數(shù),名字必須大寫開(kāi)頭

3.斷言后調(diào)用

func main() {
    //打開(kāi)加載插件,參數(shù)是插件的存儲(chǔ)位置,可以是相對(duì)路徑
    open, err := plugin.Open("/home/jwang/Documents/plg.so")
    if err != nil {
        panic(err)
    }
    //查找標(biāo)識(shí)符
    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))
}

從上面的代碼可以看到,插件的使用方式非常樸實(shí)無(wú)華,簡(jiǎn)單易懂。

一般來(lái)說(shuō),為了實(shí)現(xiàn)插件化,可以事先定義好一些接口,然后由插件去實(shí)現(xiàn)這些接口,這樣才能保證一致性,但是接口的定義不能寫在插件包或者調(diào)用包里面。這時(shí)候就需要定義一個(gè)專門的公共包,把接口的定義寫在里面,這樣插件包和調(diào)用包都可以引用。

2.注意事項(xiàng)

之所以說(shuō)這個(gè)插件方案不成熟,主要是由于主程序和插件程序之間存在很強(qiáng)的依賴性,比如:

1.編譯的GO版本必須完全一致

2.雙方依賴的公共第三方庫(kù)版本必須完全一致

3.GOPATH也得保持一致,這一點(diǎn)可以在編譯時(shí)候使用trimpath參數(shù)解決

4.插件加載之后無(wú)法卸載

這些問(wèn)題短時(shí)間內(nèi)好像官方也沒(méi)有解決的意思,或者說(shuō)無(wú)法解決。總之,Go plugin目前的應(yīng)用很少,畢竟作為網(wǎng)絡(luò)編程語(yǔ)言,在容器化大行其道的環(huán)境下,更新程序是一件很輕松的事情,除非有特殊需要。

上述就是小編為大家分享的怎么利用Go Plugin實(shí)現(xiàn)插件化編程了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI