這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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 函數進行解碼
參考連結:
- 在 Golang 中使用 Protobuf
- golang C++ installation
- go語言使用protobuf