• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2017年1月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234


            專注即時通訊及網(wǎng)游服務(wù)端編程
            ------------------------------------
            Openresty 官方模塊
            Openresty 標(biāo)準(zhǔn)模塊(Opm)
            Openresty 三方模塊
            ------------------------------------
            本博收藏大部分文章為轉(zhuǎn)載,并在文章開頭給出了原文出處,如有再轉(zhuǎn),敬請保留相關(guān)信息,這是大家對原創(chuàng)作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 219196
            • 排名 - 117

            最新評論

            閱讀排行榜

            來自:http://blog.csdn.net/andylau00j/article/details/53769446
            Golang1.8官方支持加載動態(tài)庫了,而且看起來功能很強大。 文檔上面描述Plugin功能是協(xié)程并發(fā)安全的,而且支持高級數(shù)據(jù)類型(包括chan),同時不需要寫任何C代碼(以前或多或少需要寫一些)。


            下面我們通過一些demo來看看如何使用golang plugin功能
            入門
            下面是一個簡單的plugin 代碼:
            package main
            // // No C code needed.
            import "C"
            import (
                "fmt"
            )
            var V int
            func F() { fmt.Printf("Hello, number %d\n", V) }
            這是官方提供的例子,以后我們再慢慢擴展。
            go build -buildmode=plugin  main.go  //main.go是plugin文件名稱,你可以改成其它名
            你會看到多出一個main.so動態(tài)庫。
            然后我們開始調(diào)用這個動態(tài)庫
            package main
            import (
                "plugin"
            )
            func main() {
                p, err := plugin.Open("main.so")
                if err != nil {
                    panic(err)
                }
                v, err := p.Lookup("V")
                if err != nil {
                    panic(err)
                }
                f, err := p.Lookup("F")
                if err != nil {
                    panic(err)
                }
                *v.(*int) = 7
                f.(func())() 
            正常編譯這個go文件,然后執(zhí)行它就可以看到屏幕會輸出
            Hello, number 7
            這只是最簡單的形式,下面我們增加一些難度,使用一些復(fù)雜數(shù)據(jù)類型。
            使用復(fù)雜類型
            我們自定義一個結(jié)構(gòu)體
            package data
            type VS struct {
                Name   string
                Age    int
                School string
            }
            這里需要注意,必須要把結(jié)構(gòu)體放到另外一個package中,否則build plugin時,會抱結(jié)構(gòu)體找不到。
            然后我們開始修改plugin代碼
            package main
            // // No C code needed.
            import "C"
            import (
                "fmt"
                "temp/data"
            )
            var V int
            func F() { fmt.Printf("Hello, number %d\n", V) }
            var Vs data.VS
            func ComplexType() {
                fmt.Println(Vs.Name, Vs.Age, Vs.School)
            }
            我們聲明了VS結(jié)構(gòu)體,然后增加了一個函數(shù)用來使用結(jié)構(gòu)體(需要重新編譯plugin)。 調(diào)用方也需要同步修改
            package main
            import (
                "plugin"
                "temp/data"
            )
            func main() {
                p, err := plugin.Open("main.so")
                if err != nil {
                    panic(err)
                }
                v, err := p.Lookup("V")
                if err != nil {
                    panic(err)
                }
                f, err := p.Lookup("F")
                if err != nil {
                    panic(err)
                }
                *v.(*int) = 7
                f.(func())() // prints "Hello, number 7"
                vs, err := p.Lookup("Vs")
                if err != nil {
                    panic(err)
                }
                ct, err := p.Lookup("ComplexType")
                if err != nil {
                    panic(err)
                }
                *vs.(*data.VS) = data.VS{
                    Name:   "DATA",
                    Age:    11,
                    School: "BEIDA",
                }
                ct.(func())()
            }
            在main中我們構(gòu)建了一個VS結(jié)構(gòu)體,然后給各個屬性賦值。 如果正常,你將看到如下的信息
            Hello, number 7
            DATA 11 BEIDA
            到此為止,我們已經(jīng)可以在Plugin中使用高級復(fù)雜結(jié)構(gòu)體了,可以說已經(jīng)滿足50%需求了。 但探索無止境,如果調(diào)用和Plugin之間需要互相通訊怎么辦?下面我們看看Plugin是否支持Chan。
            支持Chan
            首先聲明一個全局Chan
            package data
            type VS struct {
                Name   string
                Age    int
                School string
            }
            var Msg = make(chan VS)
            不但聲明了一個全局chan,而且是高級類型的chan。 下面在Plugin中使用chan
            package main
            // // No C code needed.
            import "C"
            import (
                "fmt"
                "temp/data"
            )
            var V int
            func F() { fmt.Printf("Hello, number %d\n", V) }
            var Vs data.VS
            func ComplexType() {
                fmt.Println(Vs.Name, Vs.Age, Vs.School)
                Vs.Age = Vs.Age * 4
                data.Msg <- Vs
            }
            Plugin接收到vs數(shù)據(jù)后,將AGE放大4倍在扔出去(扔哪里就不管了)(需要重新編譯plugin)。 再修改一下調(diào)用函數(shù):
            package main
            import (
                "plugin"
                "temp/data"
            )
            func main() {
                p, err := plugin.Open("main.so")
                if err != nil {
                    panic(err)
                }
                v, err := p.Lookup("V")
                if err != nil {
                    panic(err)
                }
                f, err := p.Lookup("F")
                if err != nil {
                    panic(err)
                }
                *v.(*int) = 7
                f.(func())() // prints "Hello, number 7"
                vs, err := p.Lookup("Vs")
                if err != nil {
                    panic(err)
                }
                ct, err := p.Lookup("ComplexType")
                if err != nil {
                    panic(err)
                }
                *vs.(*data.VS) = data.VS{
                    Name:   "DATA",
                    Age:    11,
                    School: "BEIDA",
                }
                go ct.(func())()
                select {
                case m := <-data.Msg:
                    println(m.Age)
                }
            }
            其實是在main函數(shù)中接受扔回來的VS結(jié)構(gòu)體。 編譯之后再執(zhí)行,可以看到
            Hello, number 7
            DATA 11 BEIDA
            44
            OK,執(zhí)行正常,符合預(yù)期。 這里先提供plugin如何使用,以后我們再剖析一下Golang是如何實現(xiàn)這些功能的。

            官方文檔:golang插件機制(plugin)
            https://tip.golang.org/pkg/plugin/?utm_source=tuicool&utm_medium=referral
            posted on 2017-01-19 18:44 思月行云 閱讀(2418) 評論(0)  編輯 收藏 引用 所屬分類: Golang
            久久天天日天天操综合伊人av| 久久精品国产99国产精品导航 | 精品免费tv久久久久久久| 久久91精品国产91久久户| 日批日出水久久亚洲精品tv| 丁香色欲久久久久久综合网| 亚洲国产天堂久久综合网站| 久久人人添人人爽添人人片牛牛 | 久久天天躁狠狠躁夜夜躁2014| 人妻无码中文久久久久专区| 中文字幕久久欲求不满| 国产精品99久久久精品无码 | 99精品国产在热久久 | 国产精品久久久久久福利69堂| 亚洲伊人久久综合中文成人网| 久久国产亚洲精品麻豆| 亚洲精品无码久久千人斩| 人人狠狠综合久久亚洲| 2020最新久久久视精品爱| 久久精品国产亚洲AV无码娇色| 久久噜噜久久久精品66| 国产91久久综合| 91精品日韩人妻无码久久不卡| 人妻精品久久无码专区精东影业| 久久久久女教师免费一区| 一本大道久久a久久精品综合| 国产精品久久久亚洲| 国产A级毛片久久久精品毛片| 日韩精品久久久久久久电影| 久久久WWW成人免费毛片| 久久久久国产| 色综合久久久久综合99| 婷婷久久五月天| 狠狠精品久久久无码中文字幕| 久久人人爽人人爽人人片AV不| 热久久最新网站获取| 亚洲级αV无码毛片久久精品 | 人妻少妇精品久久| 一级A毛片免费观看久久精品| 香蕉99久久国产综合精品宅男自 | 999久久久无码国产精品|