Proto GO使用教程

一、文件內構成

syntax = "proto3"; //proto版本
package api;   //生成文件的包名

/*
 簡單的demo
 段落註釋
 */

//數據結構 行註釋
message Persion {
    int64 name = 1;
    int64 age = 3;
}

1.syntax 需要在文件內指定版本
2.package 生成文件在文件內顯示的包名
3.註釋方式 //和/*/
4.message 消息結構
消息字段需要指定 類型字段名字段編號

1.字段編號

  • 1.字段編號必須是唯一的,一旦使用了消息類型,就不應更改這些字段號(請提前預留你要使用的字段號),刪除字段的標號不要重新使用

  • 2.範圍爲1到15的字段號需要一個字節來編碼,包括字段號和字段的類型(您可以在Protocol Buffer Encoding中找到有關此內容的更多信息)。16到2047之間的字段編號佔用兩個字節。因此,您應該爲經常出現的消息元素保留數字1到15。請記住爲將來可能添加的頻繁出現的元素留出一些空間。

  • 3.字段編號範圍 1-最大爲2的29次方 - 1(536870911) 其中19000-19999是不能使用的

  • 4.保留字段 如果你刪除一個字段或者註釋一個字段,而且這個字段你之後還會再用到,則將已刪除字段的字段編號(和/或名稱,也可能導致JSON序列化的問題)指定爲reserved。如果將來有任何用戶嘗試使用這些字段標識符,則協議緩衝區編譯器會報錯。請注意,您不能在同reserved一條語句中混用字段名稱和字段編號。

    message Foo {
      reserved 2, 15, 9 to 11;
      reserved "foo", "bar";
    }
    

2.字段規則

字段規則有以下兩種

  • 1.singular :一個message可以有一個或者0個該規則類型字段(默認字段規則,但是直接聲明singula會報錯,求指導原因)

  • 2.repeated:一個message可以有任意個該規則類型字段(數組)

    repeated int64 num = 1; => Num []int64

3.字段類型

詳情見https://developers.google.com/protocol-buffers/docs/proto3

4.默認值

  • string:空字符串.
  • bytes, 空bytes.
  • bools, false.
  • numeric types, 0.
  • enums:默認值爲第一個定義的枚舉值,必須爲0.
  • For message fields, the field is not set. Its exact value is language-dependent. See the generated code guide for details.

proto3 go_out 默認生成的文件的基本類型會在json裏面加入omitempty
即0值默認爲空數據

JobId     uint64  `protobuf:"fixed64,3,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`

如果希望保留默認值(在結構轉bytes的時候保留0值數據,需要去掉omitempty)
ls api/*.pb.go | xargs -n1 -IX bash -c ‘sed s/,omitempty// X > X.tmp && mv X{.tmp,}’

5.文件導入

目錄結構如下:
proto-test

  • proto1
    – Makefile
    – person.proto
    –student.proto
  • proto2
    –pet.proto
syntax = "proto3";//使用版本
package person;

/*
 簡單的demo
 段落註釋
 */
//人
message Person {
    repeated   int64 name = 1;
    int64 age = 3;
}
syntax = "proto3";//使用版本
package person;

import "person.proto";

message Student {
    Person base = 1;
}

1.包內引用:

在同一個包下,直接使用文件名導入,person和student 在同一個package person;下所以直接引用,在makefile的時候直接以下命令執行,即不需要指定輸入文件信息.

protoc  --go_out=. *.proto

2.跨包引用

syntax = "proto3";//使用版本
package person;

/*
 簡單的demo
 段落註釋
 */
//人
message Person {
    repeated   int64 name = 1;
    int64 age = 3;
}
syntax = "proto3";//使用版本
package person;

import "person.proto";
import "proto2/pet.proto";

message Student {
    Person base = 1;
    pet.Pet pet1 = 2;
}
syntax = "proto3";//使用版本
package pet;


message Pet {
    int64 name = 1;
    int64 age = 3;
}
  • 1.顯示輸入文件

student.proto裏面引用proto2裏面的pet.proto,所以在makefiles的時候需要指定輸入的文件信息

protoc   -I "./" -I "../" --go_out=. *.proto

上面的命令是指輸入文件是本目錄 和上一級目錄

  • 2.import的目錄是和-I的路徑相對應的 這裏 import “proto2/pet.proto”;是ok的,

    如果import “proto-test/proto2/pet.proto”;

    會提示 Import “proto-test/proto2/pet.proto” was not found or had errors.

  • 3.如果總是提示找不到文件

    cd …(-I “…/” )出現的是要引用的文件目錄是:proto2 所以import的時候 import “proto2/pet.proto”

二、命令解析

1.語言轉換方式

protoc --go_out=. *.proto

–go_out輸出方式 以Go文件的方式輸出
–go_out=. .proto 對當前目錄所有proto文件進行轉換輸出
–go_out=. proto1/
.proto 對當前目錄下的proto1文件內的所有proto文件進行轉換輸出

2.輸入文件

protoc   -I "./" -I "../" --go_out=. *.proto

主要是用戶跨文件的.proto引用

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