欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Go Plugin實(shí)現(xià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è)文件呢?

很簡單,分三步:

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í)無華,簡單易懂。

一般來說,為了實(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)好像官方也沒有解決的意思,或者說無法解決。總之,Go 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)文章

  • Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解

    Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解

    這篇文章主要為大家介紹了Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 詳解Go語言中泛型的實(shí)現(xiàn)原理與使用

    詳解Go語言中泛型的實(shí)現(xiàn)原理與使用

    本文是對(duì)泛型的基本思想及其在?Go?中的實(shí)現(xiàn)的一個(gè)比較容易理解的介紹,同時(shí)也是對(duì)圍繞泛型的各種性能討論的簡單總結(jié),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • GO語言入門Golang進(jìn)入HelloWorld

    GO語言入門Golang進(jìn)入HelloWorld

    本篇文章是go語言基礎(chǔ)篇,非常適合go語言剛?cè)腴T的小白,主要介紹了GO語言入門Golang進(jìn)入HelloWorld,跟著小編一起來編寫Go語言的第一程序helloworld吧
    2021-09-09
  • Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性分類詳細(xì)講解

    Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性分類詳細(xì)講解

    這篇文章主要介紹了Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • Golang 語言極簡類型轉(zhuǎn)換庫cast的使用詳解

    Golang 語言極簡類型轉(zhuǎn)換庫cast的使用詳解

    本文我們通過 cast.ToString() 函數(shù)的使用,簡單介紹了cast 的使用方法,除此之外,它還支持很多其他類型,在這沒有多多介紹,對(duì)Golang 類型轉(zhuǎn)換庫 cast相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-11-11
  • go語言調(diào)用其他包中的函數(shù)簡單示例

    go語言調(diào)用其他包中的函數(shù)簡單示例

    這篇文章主要給大家介紹了關(guān)于go語言調(diào)用其他包中的函數(shù)的相關(guān)資料,文中還介紹了Go語言同一個(gè)包中不同文件之間函數(shù)調(diào)用的相關(guān)問題,需要的朋友可以參考下
    2023-01-01
  • golang使用sort接口實(shí)現(xiàn)排序示例

    golang使用sort接口實(shí)現(xiàn)排序示例

    這篇文章主要介紹了golang使用sort接口實(shí)現(xiàn)排序的方法,簡單分析了sort接口的功能并實(shí)例演示了基于sort接口的排序?qū)崿F(xiàn)方法,需要的朋友可以參考下
    2016-07-07
  • go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬次的下單請(qǐng)求

    go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬次的下單請(qǐng)求

    這篇文章主要為大家介紹了go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬次的下單請(qǐng)求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • golang中select語句的簡單實(shí)例

    golang中select語句的簡單實(shí)例

    Go的select語句是一種僅能用于channl發(fā)送和接收消息的專用語句,此語句運(yùn)行期間是阻塞的,下面這篇文章主要給大家介紹了關(guān)于golang中select語句的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 通過案例簡單聊聊為什么說Go中的字符串是不能被修改的

    通過案例簡單聊聊為什么說Go中的字符串是不能被修改的

    在接觸Go這么語言,可能你經(jīng)常會(huì)聽到這樣一句話,對(duì)于字符串不能修改,可能你很納悶,日常開發(fā)中我們對(duì)字符串進(jìn)行修改也是很正常的,為什么又說Go中的字符串不能進(jìn)行修改呢,本文就來通過實(shí)際案例給大家演示,為什么Go中的字符串不能進(jìn)行修改
    2023-07-07

最新評(píng)論