在go语言中安装与使用protobuf的方法详解

作者:Dr_Zhang 时间:2024-04-25 15:27:32 

简介

本文主要给大家介绍了关于go语言安装使用protobuf的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

protobuf是Google开发出来的一个语言无关、平台无关的数据序列化工具,在rpc或tcp通信等很多场景都可以使用。通俗来讲,如果客户端和服务端使用的是不同的语言,那么在服务端定义一个数据结构,通过protobuf转化为字节流,再传送到客户端解码,就可以得到对应的数据结构。这就是protobuf神奇的地方。并且,它的通信效率极高,“一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一”。

安装

编译安装protobuf的编译器protoc


 wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
 tar zxvf protobuf-2.6.1.tar.gz
 cd protobuf-2.6.1./configure
 make
 make install

        执行 protoc  -h 查看安装是否成功

安装插件 protoc-gen-go,它是一个go程序,编译它之后将可执行文件执行路径写入环境变量


go get github.com/golang/protobuf/protoc-gen-go

获取proto包


go get github.com/golang/protobuf/proto

在go中使用

protobuf的使用方法是将数据结构写入到.proto文件中,使用protoc编译器编译(间接使用了插件)得到一个新的go包,里面包含go中可以使用的数据结构和一些辅助方法。

编写test.proto文件


package example;

enum FOO { X = 17; };

message Test {
 required string label = 1;
 optional int32 type = 2 [default=77];
 repeated int64 reps = 3;
 optional group OptionalGroup = 4 {
 required string RequiredField = 5;
 }
}

    编译:

    执行 protoc --go_out=. *.proto 生成 test.pb.go 文件

    将test.pb.go文件放入example文件夹(对应上面package)中,作为example包

try


package main

import (
 "log"

"github.com/golang/protobuf/proto"
 "example"
)

func main() {
 test := &example.Test {
  Label: proto.String("hello"),
  Type: proto.Int32(17),
  Reps: []int64{1, 2, 3},
  Optionalgroup: &example.Test_OptionalGroup {
   RequiredField: proto.String("good bye"),
  },
 }
 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())
 }
 //test.GetOptionalgroup().GetRequiredField()
 //etc
}

一些对应关系

  • message Test对为 struct 结构,其属性字段有了对应的get方法,在go中可以使用test.GetLabel()test.GetType()获取test对象的属性

  • OptionalGroup对应为 struct中的内嵌struct

  • proto文件中repeated属性对于slice结构

  • test.Reset()可以使其所有属性置为0值

  • 使用Marshal和Unmarshal可以轻松的编码和解码

这些只是一些特性,想要仔细研究可以查看github上的wiki:https://github.com/golang/protobuf

来源:https://segmentfault.com/a/1190000010477733

标签:go语言,protobuf
0
投稿

猜你喜欢

  • django template实现定义临时变量,自定义赋值、自增实例

    2021-05-24 09:16:46
  • Flask 使用工厂模式

    2021-10-01 01:52:58
  • python 读写中文json的实例详解

    2022-12-12 20:27:36
  • JS中的算法与数据结构之集合(Set)实例详解

    2024-04-16 09:28:34
  • oracle命令行删除与创建用户的代码

    2009-03-02 10:54:00
  • 用户不需要信息快餐

    2009-02-25 12:34:00
  • 全面解析Python的While循环语句的使用方法

    2023-12-21 04:41:11
  • flask-socketio实现WebSocket的方法

    2022-09-25 17:26:24
  • pycharm使用anaconda全过程

    2023-07-19 04:57:12
  • vue elementUI实现自定义正则规则验证

    2024-05-28 16:00:58
  • Python技能树共建之python urllib 模块

    2023-02-07 04:02:40
  • MySQL事务(transaction)看这篇就足够了

    2024-01-12 13:54:09
  • Python实现连点器的示例代码

    2023-04-17 00:11:29
  • 利用python做数据拟合详情

    2023-04-22 15:32:17
  • PHP基于非递归算法实现先序、中序及后序遍历二叉树操作示例

    2023-08-16 04:46:47
  • 如何恢复MYSQL的ROOT口令

    2024-01-16 15:50:08
  • Transactional replication(事务复制)详解之如何跳过一个事务

    2024-01-19 15:41:16
  • Go 语言数组和切片的区别详解

    2024-04-25 15:08:37
  • pycharm 配置远程解释器的方法

    2022-05-22 05:10:40
  • 在ASP处理程序时,进度显示

    2008-08-04 13:27:00
  • asp之家 网络编程 m.aspxhome.com