golang 使用 protobuf 的教程

1、下載protobuf的編譯器protoc

地址:https://github.com/google/protobuf/releases

window:
    下載: protoc-3.3.0-win32.zip
    解壓,把bin目錄下的protoc.exe複製到GOPATH/bin下,GOPATH/bin加入環境變量。(不加也行)
    當然也可放在其他目錄,需加入環境變量,能讓系統找到protoc.exe
linux:
    下載:protoc-3.3.0-linux-x86_64.zip 或 protoc-3.3.0-linux-x86_32.zip
    解壓,把bin目錄下的protoc複製到GOPATH/bin下,GOPATH/bin加入環境變量。
    如果喜歡編譯安裝的,也可下載源碼自行安裝,最後將可執行文件加入環境變量。


2、獲取protobuf的編譯器插件protoc-gen-go
    進入GOPATH目錄
    運行go get -u github.com/golang/protobuf/protoc-gen-go

    如果成功,會在GOPATH/bin下生成protoc-gen-go.exe文件

protoc.exe和protoc-gen-go.exe如下

3、獲取protobuf的golang接口模塊

go get -u github.com/golang/protobuf/proto

4、在test文件夾下創建一個test.proto文件

//指定版本
//注意proto3與proto2的寫法有些不同
syntax = "proto3";

//包名,通過protoc生成時go文件時
package test;

//手機類型
//枚舉類型第一個字段必須爲0
enum PhoneType {
    HOME = 0;
    WORK = 1;
}

//手機
message Phone {
    PhoneType type = 1;
    string number = 2;
}

//人
message Person {
    //後面的數字表示標識號
    int32 id = 1;
    string name = 2;
    //repeated表示可重複
    //可以有多個手機
    repeated Phone phones = 3;
}

//聯繫簿
message ContactBook {
    repeated Person persons = 1;
}

5、進入test目錄,運行命令:protoc --go_out=. *.proto

會在同目錄下會生成一個test.pb.go的文件,具體的文件內容我就不截圖了。

6、在go語言中使用protobuf

package main;

import (
   "github.com/golang/protobuf/proto"
   "go_dev/kongji/proto/test"
   "io/ioutil"
   "os"
   "fmt"
)

func write() {
   p1 := &test.Person{
      Id:   1,
      Name: "小張",
      Phones: []*test.Phone{
         {test.PhoneType_HOME, "111111111"},
         {test.PhoneType_WORK, "222222222"},
      },
   };
   p2 := &test.Person{
      Id:   2,
      Name: "小王",
      Phones: []*test.Phone{
         {test.PhoneType_HOME, "333333333"},
         {test.PhoneType_WORK, "444444444"},
      },
   };

   //創建地址簿
   book := &test.ContactBook{};
   book.Persons = append(book.Persons, p1);
   book.Persons = append(book.Persons, p2);

   //編碼數據
   data, _ := proto.Marshal(book);
   //把數據寫入文件
   ioutil.WriteFile("./test.txt", data, os.ModePerm);
}

func read() {
   //讀取文件數據
   data, _ := ioutil.ReadFile("./test.txt");
   book := &test.ContactBook{};
   //解碼數據
   proto.Unmarshal(data, book);
   for _, v := range book.Persons {
      fmt.Println(v.Id, v.Name);
      for _, vv := range v.Phones {
         fmt.Println(vv.Type, vv.Number);
      }
   }
}

func main() {
   write();
   read();
}

small_lei_it 技術無止境,追求更高。

相關鏈接:

Protobuf語法

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章