ubuntu下go語言使用protobuf

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

1. 編譯安裝protobuf(protobuf 沒有關於go的release)

   為了從源碼安裝protobuf,先要安裝一些工具:包括autoconf、automake、libtool、curl(用於下載gmock)、make、 g++、 unzip。      在ubuntu可以使用如下命令安裝這些依賴:
   sudo apt-get install autoconf automake libtool curl make g++ unzip
然後使用 git clone  https://github.com/google/protobuf命令下載protobuf的源碼包。接者使用命令 cd protobuf進入源碼庫中然後使用  ./autogen.sh運行指令碼產生需要的配置指令碼接著執行如下的一系列命令來編譯安裝protocol buffer的complier./configuremakemake checksudo make installsudo ldconfig   最後的一個命令是用於重新整理共用庫的緩衝的。,最後一個命令我的ubuntu無法執行

2. 安裝proto-gen-go

 命令如下: go get -u github.com/golang/protobuf/proto           go get -u github.com/golang/protobuf/protoc-gen-go然後將環境變數GOPATH定義的目錄下的bin目錄加入到環境變數PATH中。命令如下:vi  ~/.bashrc然後在該檔案最後加上:export PATH="$PATH:$GOPATH/bin"即可。然後調用 source ~/.bashrc

3.定義一個proto檔案test.proto如下:

package example;enum FOO { X = 17; };message Test {required string label = 1;optional int32 type = 2 [default=77];repeated int64 reps = 3;optional group OptionalGroup = 4 {required string RequiredField = 5;}}

在該檔案對應的檔案夾中執行命令:protoc --go_out=. *.proto用於產生.pb.go檔案。如果這個命令執行過程中出現 protoc-gen-go: program not found or is not executable 這個錯誤,表示該protoc-gen-go沒有被加入到Path環境變數中,應該把該檔案的所在目錄加入Path變數中。該檔案存放在環境變數GOPATH目錄下的bin子目錄裡。

4.編寫測試代碼:

 首先要將上一節產生的example包放入GOPATH目錄下的src檔案夾下: 然後建立如下的測試代碼:
package mainimport (    "fmt"    "github.com/golang/protobuf/proto"    // test.pb.go 的路徑    "example")func main() {    // 建立一個訊息 Test    test := &example.Test{        // 使用輔助函數設定域的值        Label: proto.String("hello"),        Type:  proto.Int32(17),        Optionalgroup: &example.Test_OptionalGroup{            RequiredField: proto.String("good bye"),        },    }    // 進行編碼    data, err := proto.Marshal(test)    if err != nil {        fmt.Println("marshaling error: ", err)    }    // 進行解碼    newTest := &example.Test{}    err = proto.Unmarshal(data, newTest)    if err != nil {        fmt.Println("unmarshaling error: ", err)    }    // 測試結果    if test.GetLabel() != newTest.GetLabel() {        fmt.Println("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())    }    fmt.Printf("%+v", newTest)}

5 golang中可用的protobuf的介面:

在使用之前,我們先瞭解一下每個 Protobuf 訊息在 Golang 中有哪一些可用的介面:    1.  每一個 Protobuf 訊息對應一個 Golang 結構體    2. 訊息中網域名稱字為 camel_case 在對應的 Golang 結構體中為 CamelCase    3. 訊息對應的 Golang 結構體中不存在 setter 方法,只需要直接對結構體賦值即可,賦值時可能使用到一些輔助函數,例如:       msg.Foo = proto.String("hello")    4. 訊息對應的 Golang 結構體中存在 getter 方法,用於返回域的值,如果域未設定值,則返回一個預設值    5. 訊息中非 repeated 的域都被實現為一個指標,指標為 nil 時表示域未設定訊息中 repeated 的域被實現為 slice    6. 訪問枚舉值時,使用“枚舉類型名_枚舉名”的格式(更多內容可以直接閱讀產生的源碼)    7. 使用 proto.Marshal 函數進行編碼,使用 proto.Unmarshal 函數進行解碼

參考連結:

  1. 在 Golang 中使用 Protobuf
  2. golang C++ installation
  3. go語言使用protobuf
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.