91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用Go Plugin實現插件化編程

發布時間:2021-11-01 09:16:37 來源:億速云 閱讀:141 作者:柒染 欄目:開發技術

這期內容當中小編將會給大家帶來有關怎么利用Go Plugin實現插件化編程,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

前言

說到插件這個東西,很多人都不陌生,一般來說,插件化有幾個好處,一個是增加程序擴展性,豐富功能。另外,還可以實現熱更新,有些大型應用,動輒幾個GB的安裝程序,如果一個小小的更新就需要重新下載整個程序,這時候我們就可以把經常更新的模塊插件化,這樣更新的時候只需要下載一個小更新文件。比如說平時咱們Chrome瀏覽器都會裝一些插件,可以擴展瀏覽器實現更多的功能,還能靈活的安裝卸載。

Golang在1.8版本之后提供了一個 Plugin 的機制,可以動態的加載so文件,實現插件化,雖然并不是非常成熟,但是在特定的情況下還是非常好用。

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

1.快速開始

插件代碼和普通代碼沒什么區別,只是在編譯的時候不一樣,但是要求是必須只有一個main包

package main

var Name = "Plugin Name"

func GetName() string {
    return Name
}

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

很簡單,分三步:

1.先打開so文件,如果一個插件已經被打開了,那么會返回已存在的plugin

2.使用Lookup查找需要調用的變量或者函數,名字必須大寫開頭

3.斷言后調用

func main() {
    //打開加載插件,參數是插件的存儲位置,可以是相對路徑
    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))
}

從上面的代碼可以看到,插件的使用方式非常樸實無華,簡單易懂。

一般來說,為了實現插件化,可以事先定義好一些接口,然后由插件去實現這些接口,這樣才能保證一致性,但是接口的定義不能寫在插件包或者調用包里面。這時候就需要定義一個專門的公共包,把接口的定義寫在里面,這樣插件包和調用包都可以引用。

2.注意事項

之所以說這個插件方案不成熟,主要是由于主程序和插件程序之間存在很強的依賴性,比如:

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

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

3.GOPATH也得保持一致,這一點可以在編譯時候使用trimpath參數解決

4.插件加載之后無法卸載

這些問題短時間內好像官方也沒有解決的意思,或者說無法解決。總之,Go plugin目前的應用很少,畢竟作為網絡編程語言,在容器化大行其道的環境下,更新程序是一件很輕松的事情,除非有特殊需要。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双辽市| 喜德县| 阿拉善盟| 东阳市| 西平县| 淄博市| 建宁县| 洛浦县| 沙河市| 宝丰县| 棋牌| 吉首市| 华亭县| 建宁县| 郁南县| 伊宁县| 临漳县| 晋中市| 伊金霍洛旗| 梓潼县| 比如县| 克拉玛依市| 阿鲁科尔沁旗| 昭觉县| 西乡县| 牟定县| 策勒县| 绵阳市| 镇江市| 大洼县| 剑川县| 郓城县| 巴里| 潜山县| 文水县| 张掖市| 安义县| 房产| 琼海市| 玉屏| 泗水县|