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

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

 更新時(shí)間:2021年10月30日 13:41:40   作者:JWang  
Golang官方提供了plugin模塊,該模塊可以支持插件開,下面這篇文章主要給大家介紹了關(guān)于如何利用Go Plugin實(shí)現(xiàn)插件化編程的相關(guān)資料,需要的朋友可以參考下

前言

說到插件這個(gè)東西,很多人都不陌生,一般來說,插件化有幾個(gè)好處,一個(gè)是增加程序擴(kuò)展性,豐富功能。另外,還可以實(shí)現(xiàn)熱更新,有些大型應(yīng)用,動(dòng)輒幾個(gè)GB的安裝程序,如果一個(gè)小小的更新就需要重新下載整個(gè)程序,這時(shí)候我們就可以把經(jīng)常更新的模塊插件化,這樣更新的時(shí)候只需要下載一個(gè)小更新文件。比如說平時(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.快速開始

插件代碼和普通代碼沒什么區(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.先打開so文件,如果一個(gè)插件已經(jīng)被打開了,那么會(huì)返回已存在的plugin

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

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

func main() {
    //打開加載插件,參數(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í)無華,簡(jiǎn)單易懂。

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

2.注意事項(xiàng)

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

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

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

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

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

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

總結(jié)

到此這篇關(guān)于利用Go Plugin實(shí)現(xiàn)插件化編程的文章就介紹到這了,更多相關(guān)Go Plugin插件化編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

    GoLand如何設(shè)置中文

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

    簡(jiǎn)單講解Go程序中使用MySQL的方法

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

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

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

    詳解golang碎片整理之 fmt.Scan

    本文介紹了從golang語言中fmt包從標(biāo)準(zhǔn)輸入獲取數(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)存泄露,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • golang使用iconv報(bào)undefined:XXX的問題處理方案

    golang使用iconv報(bào)undefined:XXX的問題處理方案

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

    golang 內(nèi)存對(duì)齊的實(shí)現(xiàn)

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

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

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

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

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

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

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

最新評(píng)論

治县。| 全南县| 白沙| 塔河县| 惠水县| 海阳市| 绵竹市| 旅游| 彰武县| 万盛区| 封开县| 望江县| 泸定县| 伊金霍洛旗| 大丰市| 连山| 鹿泉市| 石门县| 马尔康县| 江阴市| 祁阳县| 纳雍县| 博乐市| 广元市| 文山县| 金昌市| 成安县| 锦屏县| 祥云县| 宾阳县| 南城县| 襄垣县| 军事| 原平市| 嘉黎县| 三门峡市| 休宁县| 修水县| 全州县| 和田市| 寻乌县|