• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go使用protobuf

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文更新于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文件。如:

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

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

    package main
    
    import (
    	"log"
    	
    	"github.com/golang/protobuf/proto"
    	
    	"path/to/example"
    )
    
    func main() {
    	test := &example.Test{
    		Label: proto.String("hello"),
    		Type:  proto.Int32(17),
    		Reps:  []int64{1, 2, 3},
    	}
    	data, err := proto.Marshal(test)
    	if err != nil {
    		log.Fatal("marshaling error: ", err)
    	}
    	newTest := &example.Test{}
    	err = proto.Unmarshal(data, newTest)
    	if err != nil {
    		log.Fatal("unmarshaling error: ", err)
    	}
    	// Now test and newTest contain the same data.
    	if test.GetLabel() != newTest.GetLabel() {
    		log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
    	}
    	// etc.
    }
    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap