最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Go Plugin實現(xiàn)插件化編程的簡單方法

 更新時間:2021年10月30日 13:41:40   作者:JWang  
Golang官方提供了plugin模塊,該模塊可以支持插件開,下面這篇文章主要給大家介紹了關(guān)于如何利用Go Plugin實現(xiàn)插件化編程的相關(guā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)好像官方也沒有解決的意思,或者說無法解決??傊珿o 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)文章

  • GoLand如何設(shè)置中文

    GoLand如何設(shè)置中文

    這篇文章主要介紹了GoLand如何設(shè)置中文,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 簡單講解Go程序中使用MySQL的方法

    簡單講解Go程序中使用MySQL的方法

    這篇文章主要介紹了Go程序中使用MySQL的方法,需要使用第三方包來進行連接,需要的朋友可以參考下
    2015-10-10
  • golang調(diào)用windows平臺的dll庫的方法實現(xiàn)

    golang調(diào)用windows平臺的dll庫的方法實現(xiàn)

    本文主要介紹了golang調(diào)用windows平臺的dll庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • 詳解golang碎片整理之 fmt.Scan

    詳解golang碎片整理之 fmt.Scan

    本文介紹了從golang語言中fmt包從標準輸入獲取數(shù)據(jù)的Scan系列函數(shù)、從io.Reader中獲取數(shù)據(jù)的Fscan系列函數(shù)以及從字符串中獲取數(shù)據(jù)的Sscan系列函數(shù)的用法,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露問題解析

    Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露問題解析

    這篇文章主要介紹了Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • golang使用iconv報undefined:XXX的問題處理方案

    golang使用iconv報undefined:XXX的問題處理方案

    這篇文章主要介紹了golang使用iconv報undefined:XXX的問題處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • golang 內(nèi)存對齊的實現(xiàn)

    golang 內(nèi)存對齊的實現(xiàn)

    在代碼編譯階段,編譯器會對數(shù)據(jù)的存儲布局進行對齊優(yōu)化,本文主要介紹了golang 內(nèi)存對齊的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Go語言入門教程之基礎(chǔ)語法快速入門

    Go語言入門教程之基礎(chǔ)語法快速入門

    這篇文章主要介紹了Go語言入門教程之基礎(chǔ)語法快速入門,本文講解了值類型、變量、常量、循環(huán)、條件語句、條件枚舉等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • Golang 實現(xiàn) Redis系列(六)如何實現(xiàn) pipeline 模式的 redis 客戶端

    Golang 實現(xiàn) Redis系列(六)如何實現(xiàn) pipeline 模式的 redis 客戶端

    pipeline 模式的 redis 客戶端需要有兩個后臺協(xié)程負責(zé) tcp 通信,調(diào)用方通過 channel 向后臺協(xié)程發(fā)送指令,并阻塞等待直到收到響應(yīng),本文是使用 golang 實現(xiàn) redis 系列的第六篇, 將介紹如何實現(xiàn)一個 Pipeline 模式的 Redis 客戶端。
    2021-07-07
  • 使用Go語言開發(fā)短鏈接服務(wù)的方法

    使用Go語言開發(fā)短鏈接服務(wù)的方法

    短鏈接一般是通過映射關(guān)系,將長長的一串網(wǎng)址,映射到幾個字符的短鏈接上,建立好這種映射關(guān)系之后保存到數(shù)據(jù)庫里,用戶每次訪問短鏈接的時候,這篇文章主要介紹了使用Go語言開發(fā)一個短鏈接服務(wù),需要的朋友可以參考下
    2024-03-03

最新評論

徐水县| 焦作市| 彩票| 邳州市| 通许县| 常宁市| 察隅县| 青龙| 玛曲县| 特克斯县| 库伦旗| 那曲县| 汕头市| 通城县| 霍山县| 南京市| 桐乡市| 榆社县| 临洮县| 弥渡县| 东阳市| 马边| 腾冲县| 伊宁县| 儋州市| 松桃| 建宁县| 米泉市| 义乌市| 五华县| 于田县| 昌邑市| 吉隆县| 武平县| 安化县| 岑巩县| 庆安县| 贵溪市| 洛隆县| 沙湾县| 裕民县|