经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Go使用protobuf
来源:cnblogs  作者:garvenc  时间:2019/1/4 9:27:42  对本文有异议

本文更新于2019-01-03。

  1. https://github.com/protocolbuffers/protobuf/releases下载protoc(如:Windows则下载protoc-3.6.1-win32.zip)。protoc命令位于bin目录下。
  2. go get github.com/golang/protobuf
  3. 编译github.com/golang/protobuf/protoc-gen-go。因protoc需调用protoc-gen-go,故需将protoc-gen-go放在环境变量PATH指定的目录中,或protoc所在的目录。
  4. 定义proto文件。如:

    1. syntax = "proto2";
    2. package example;
    3. enum FOO { X = 17; };
    4. message Test {
    5. required string label = 1;
    6. optional int32 type = 2 [default=77];
    7. repeated int64 reps = 3;
    8. }
  5. 使用protoc生成go代码,生成的文件名为*.pb.go。

    1. protoc --proto_path=IMPORT_PATH --go_out=DST_DIR *.proto
    • --proto_path:同-I,指定proto文件的目录,缺省则为当前进程目录。
    • --go_out:指定go文件生成目录。
  6. 调用(示例中假设生成的go代码位于path/to/example)。

    1. package main
    2. import (
    3. "log"
    4. "github.com/golang/protobuf/proto"
    5. "path/to/example"
    6. )
    7. func main() {
    8. test := &example.Test{
    9. Label: proto.String("hello"),
    10. Type: proto.Int32(17),
    11. Reps: []int64{1, 2, 3},
    12. }
    13. data, err := proto.Marshal(test)
    14. if err != nil {
    15. log.Fatal("marshaling error: ", err)
    16. }
    17. newTest := &example.Test{}
    18. err = proto.Unmarshal(data, newTest)
    19. if err != nil {
    20. log.Fatal("unmarshaling error: ", err)
    21. }
    22. // Now test and newTest contain the same data.
    23. if test.GetLabel() != newTest.GetLabel() {
    24. log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
    25. }
    26. // etc.
    27. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号