Golang中使用ProtoBuf
protobuf類似json,它體積更小效率更高

Golang中使用ProtoBuf

protobuf類似json,它體積更小效率更高,規範統一(沒有大小寫等困擾)。

缺點是改動協議就要重新生成、數據本身是二進位沒有可讀性

  1. 下載,window系統選.exe,解壓縮放到$GOPATH/bin

    https://github.com/protocolbuffers/protobuf/releases
    
  2. 安裝golang對應的庫跟插件

    go get github.com/golang/protobuf/proto
    go get github.com/golang/protobuf/protoc-gen-go
    
  3. 測試

    protoc -h 或 protoc --version
    

    沒報錯就是成功

  4. 消息體舉例,xxx.proto

    // 指定版本,不打3就會是2
    syntax="proto3";
    
    // 指定輸出位置&go包名,沒寫轉換不了
    // option go_package ="path;name";
    option go_package ="/.";  // 放在同一目錄下包名為__(空)
    
    // 定義消息體,分配唯一編號 (不能用19000~19999)
    message Student{
         int32 age = 1; // 可以不從1開始,但不可重複
         string name = 2;
         People p=3;
         repeated int32 score=4; // 數組
         Week w=5;
         // 聯合體
         oneof data{
             string teacher=6;
             string class=7;
         }
     }
    
    // 消息體可以嵌套
    message People{
        int32 weight=1;
    }
    
    // 定義枚舉類型
    enum Week{
        Monday=0; // 必須從0開始
        Turesday=1;
    }
    
  5. 生成go文件

    protoc --go_out=. *.proto
    
  6. 成功轉換出來的就會是一個xxx.pb.go的文件,可以點開看一下,它就是轉換成go語言的版本,記住不要修改這個檔案(他第一行就叫你不要修改)

添加rpc服務

  • 語法:

    service 服務名{
    	rpc 函數名(參數:消息體) returns (返回值:消息)
    }
    舉例:
    service bj{
        rpc Say(People) returns (Student);
    }
    

    但是rpc用的很廣,他不知道你要轉成給誰用的,於是要調用另一個生成的指令

    protoc --go_out=plugins=grpc:. *.proto
    

    這就是grpc了,到下章繼續…


上次修改於 2021-09-26

此篇文章的評論功能已經停用。