• <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>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            Mac下Go安裝配置并使用Protobuf

            首先使用Home Brew安裝Protobuf:
            brew install protobuf

            安裝好之后,查看是否安裝成功
            protoc --version

            如果成功會(huì)有如下類似的版本號(hào)顯示:
            libprotoc 3.1.0
            這表明我安裝成功,并且版本號(hào)是3.1.0。

            接著安裝protobuf的golang插件
            go get -u -v github.com/golang/protobuf/proto
            go get -u -v github.com/golang/protobuf/protoc-gen-go

            因?yàn)閜rotoc需要依賴調(diào)用protoc-gen-go,所以,它的路徑必須要添加到環(huán)境變量里面去。
            它存在于$GOPATH/bin之下。
            我使用的shell是zsh,因此需要修改配置`/.zshrc
            在最后添加配置:
            export GOPATH=$HOME/Documents/golang/
            export GOBIN=$GOPATH/bin
            export PATH="$GOBIN:$PATH"
            保存,然后重開(kāi)zsh,即可。

            我的workspace看起來(lái)是這樣的文件夾結(jié)構(gòu):


            protobuf協(xié)議源文件放在了protocol/proto下面
            helloworld.proto
             syntax = "proto2";

            package test;

            message helloworld 

                required int32     id = 1;  // ID 
                required string    str = 2;  // str 
                optional int32     opt = 3;  //optional field 
            }
            在這里需要注意幾點(diǎn):
            1.如果不定義package,編譯器會(huì)自行的將文件名生成package名,如上面的例子將會(huì)生成一一個(gè)package helloword;
            2.因?yàn)間olang遵循的是駝峰規(guī)則,message和field的名字首字母將會(huì)自動(dòng)轉(zhuǎn)為大寫字母(如果首字母為下劃線,則下劃線會(huì)被自動(dòng)轉(zhuǎn)換為大寫的X),而package名則不會(huì);

            接著我們就可以用命令行編譯出go代碼了:
            protoc --go_out=. helloworld.proto
            運(yùn)行該命令之后,如果協(xié)議沒(méi)有語(yǔ)法錯(cuò)誤,則會(huì)在proto文件同級(jí)目錄下生成一個(gè)hellword.pb.go的代碼文件,接著我們就能直接拿來(lái)用了。

            如果是一個(gè)proto文件,使用一條命令生成是沒(méi)有問(wèn)題的,但是在現(xiàn)實(shí)中,并不會(huì)只有一個(gè),會(huì)有多個(gè),那么就需要有批量的生成工具了,在mac/linux下面使用shell腳本可以搞定,在Windows下可以用bat批處理腳本搞定,下面給一個(gè)mac下的shell腳本示例代碼:
            generate_code.sh
            path=$(dirname $0)
            path=${path/\./$(pwd)}
            #echo $path

            # /////////////////////////////////////////////////////////////////////////////
            #
            #
             編譯Protobuf協(xié)議
            #
            #
             /////////////////////////////////////////////////////////////////////////////

            protoc --version

            protoc --go_out=$path/../ -I=$path $path/helloworld.proto
            記得修改文件可執(zhí)行權(quán)限,我就很偷懶,用:chmod 777 generate_code.sh搞定。

            最后寫go的測(cè)試代碼了:
            testpb.go
            package main

            import (
                "./protocol"
                "fmt"
                "github.com/golang/protobuf/proto"
                "log"
            )

            func main() {

                // 創(chuàng)建一個(gè)消息
                data_encode := &test.Helloworld{
                    Id:  proto.Int32(11),
                    Str: proto.String("hello world!"),
                    Opt: proto.Int32(17),
                }

                // 進(jìn)行編碼
                data, err := proto.Marshal(data_encode)
                if err != nil {
                    log.Fatal("marshaling error: ", err)
                }

                // 進(jìn)行解碼
                data_decode := &test.Helloworld{}
                err = proto.Unmarshal(data, data_decode)
                if err != nil {
                    log.Fatal("unmarshaling error: ", err)
                }

                // 測(cè)試結(jié)果
                if data_encode.GetId() != data_decode.GetId() {
                    log.Fatalf("data mismatch %q != %q", data_encode.GetId(), data_decode.GetId())
                }
                fmt.Println("ID:", data_decode.GetId())
                fmt.Println("Str:", data_decode.GetStr())
                fmt.Println("Opt:", data_decode.GetOpt())
            }
            這里需要注意的是,import里面所填寫的是go文件的路徑,而無(wú)需要填寫文件名,也就是go文件的搜索路徑,默認(rèn)的根目錄是$GOPATH/src,如果是放在src里面,則直接寫"protocol"即可,但是我不希望如此,我把它放在了測(cè)試go文件的同級(jí)目錄下了,那么,我就需要這樣寫"./protocol"(需要注意的是,斜杠只能寫/而不能\)。

            好了,現(xiàn)在開(kāi)始編譯:
            go build testpb.go

            接著是執(zhí)行:
            ./testpb

            預(yù)期的結(jié)果是這樣的:


            下面是測(cè)試代碼的完整打包:
            /Files/tx7do/test_pb_go.zip

            參考資料:
            https://github.com/golang/protobuf
            http://www.jianshu.com/p/091be5025f03
            https://my.oschina.net/ifraincoat/blog/510971
            http://studygolang.com/articles/5213
            http://www.cnblogs.com/baiyuxiong/p/4310121.html

            posted on 2016-12-23 13:37 楊粼波 閱讀(2798) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            伊人久久综合无码成人网| 久久青草国产精品一区| 久久亚洲AV无码西西人体| 欧美久久久久久精选9999| 久久国产免费直播| 国产精品久久久久影视不卡| 久久99精品久久久久久齐齐| 狠狠色噜噜色狠狠狠综合久久| 国内精品九九久久久精品| 国产一区二区精品久久岳| 囯产极品美女高潮无套久久久| 99久久免费国产精精品| 一级a性色生活片久久无| 久久福利青草精品资源站免费| 性欧美大战久久久久久久 | 久久久黄色大片| 久久99精品久久久久婷婷| 日本高清无卡码一区二区久久| 婷婷久久久亚洲欧洲日产国码AV| 国产精品久久久久久久久久免费| 性高湖久久久久久久久| 国产精品久久久久蜜芽| 91亚洲国产成人久久精品| 久久香蕉超碰97国产精品| 日韩欧美亚洲综合久久 | 91久久婷婷国产综合精品青草| 免费一级做a爰片久久毛片潮| 99久久www免费人成精品| 国内精品久久久久久99蜜桃| 人妻精品久久无码专区精东影业| 日韩电影久久久被窝网| 久久国产精品偷99| 99久久免费只有精品国产| 久久综合狠狠色综合伊人| 久久精品亚洲精品国产色婷| 亚洲综合伊人久久综合| 一本色综合网久久| 久久99精品久久只有精品 | 久久久久亚洲AV片无码下载蜜桃 | 久久综合视频网| 久久久久久国产精品无码下载|