Go工程师体系课 protobuf_guide【学习笔记】

Protocol Buffers 入门指南

1. 简介

Protocol Buffers(简称 protobuf)是 Google 开发的一种语言无关、平台无关、可扩展的结构化数据序列化机制。与 JSON、XML 等序列化方式相比,protobuf 更小、更快、更简单。

2. 安装

2.1 安装 protoc 编译器

protoc 编译器用于将 .proto 文件编译成特定编程语言的源代码。

  1. https://github.com/protocolbuffers/protobuf/releases 下载适合您平台的预编译版本。
  2. 解压后,将 bin 目录下的 protoc 可执行文件拷贝到系统的 PATH 环境变量包含的目录下(例如 /usr/local/bin)。
  3. 验证安装:

bash
protoc --version

2.2 安装 protobuf 运行时环境

不同编程语言需要安装相应的 protobuf 运行时环境。例如,对于 Go 语言:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

确保将 $GOPATH/bin 添加到系统的 PATH 环境变量中,以便 protoc 可以找到 protoc-gen-go 插件。

3. 定义消息类型

创建一个 .proto 文件,定义数据结构。例如,创建 student.proto

syntax = "proto3";

package main;

message Student {
  string name = 1;
  bool male = 2;
  repeated int32 scores = 3;
}

在当前目录下执行以下命令,生成 Go 语言的代码:

protoc --go_out=. student.proto

这将生成 student.pb.go 文件,包含了 Student 类型的 Go 语言实现。

4. 使用生成的代码

在 Go 语言中,可以使用生成的代码进行数据的序列化和反序列化。

package main

import (
  "fmt"
  "log"

  "google.golang.org/protobuf/proto"
)

func main() {
  student := &Student{
    Name:   "Alice",
    Male:   false,
    Scores: []int32{90, 95, 100},
  }

  // 序列化
  data, err := proto.Marshal(student)
  if err != nil {
    log.Fatal("Marshaling error: ", err)
  }

  // 反序列化
  newStudent := &Student{}
  err = proto.Unmarshal(data, newStudent)
  if err != nil {
    log.Fatal("Unmarshaling error: ", err)
  }

  fmt.Println("Student:", newStudent)
}

5. 字段规则

  • optional:表示该字段是可选的,可以设值也可以不设值。如果没有设值,将使用默认值进行初始化。
  • repeated:表示该字段可以重复任意次数使用,类似于动态数组。

注意:在 proto3 中,required 关键字已被移除,所有字段默认都是可选的。

6. 枚举和嵌套类型

可以在 .proto 文件中定义枚举类型和嵌套的消息类型。例如:

syntax = "proto3";

package main;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;
}

7. 向后兼容性

在更新 .proto 文件时,为了保持向后兼容性,应遵循以下规则:

  • 不要更改已有字段的编号。
  • 不要删除已有的字段。
  • 可以添加新的字段,但必须使用新的编号。
  • 可以添加新的枚举值。

遵循这些规则可以确保旧的代码仍然可以解析新的消息格式。

8. 更多资源

主题测试文章,只做测试使用。发布者:Walker,转转请注明出处:https://walker-learn.xyz/archives/4460

(0)
Walker的头像Walker
上一篇 2026年3月10日 00:00
下一篇 2026年3月8日 15:40

相关推荐

  • Go工程师体系课 007【学习笔记】

    商品微服务 实体结构说明 本模块包含以下核心实体: 商品(Goods) 商品分类(Category) 品牌(Brands) 轮播图(Banner) 品牌分类(GoodsCategoryBrand) 1. 商品(Goods) 描述平台中实际展示和销售的商品信息。 字段说明 字段名 类型 说明 name String 商品名称,必填 brand Pointer …

    个人 2025年11月25日
    28500
  • 深入理解ES6 012【学习笔记】

    代理(Proxy)和反射(Reflection)API 代理是一种可以拦截并改变底层javascript引擎操作的包装器,在新语言中通过它暴露内部运作对象,从而让开发者可以创建内建的对象。 代理陷阱 覆写的特性 默认特性 get 读取一个属性值 Reflect.get() set 写入一个属性值 Reflect.set() has in操作符 Reflect…

    个人 2025年3月8日
    1.2K00
  • Go工程师体系课 004【学习笔记】

    需求分析 后台管理系统 商品管理 商品列表 商品分类 品牌管理 品牌分类 订单管理 订单列表 用户信息管理 用户列表 用户地址 用户留言 轮播图管理 电商系统 登录页面 首页 商品搜索 商品分类导航 轮播图展示 推荐商品展示 商品详情页 商品图片展示 商品描述 商品规格选择 加入购物车 购物车 商品列表 数量调整 删除商品 结算功能 用户中心 订单中心 我的…

    2025年11月25日
    27600
  • 深入理解ES6 004【学习笔记】

    扩展对象的功能 普通对象 具有js对象所有默认内部行为的 特异对象 具有某些与默认行为不符的内部行为 标准对象 es6规范中定义的对象,Array/Date等 内建对象 脚本开始执行时存在于javascript执行环境的对象,所有标准对象都是内建对象 对象字面量语法扩展 属性初始值的简写,当一个对象的属性与本地变量同名时,不必再写冒号和值 对象方法的简写语法…

    个人 2025年3月8日
    1.3K00
  • Node深入浅出(圣思园教育) 003【学习笔记】

    WebSocket 与 SSE 总览 WebSocket 基础 定位:WebSocket 是一条在 HTTP 握手后升级的全双工连接,允许客户端与服务器在同一 TCP 通道上双向推送数据,省去了反复轮询。 握手流程: 客户端通过 Upgrade: websocket 头发起 HTTP 请求; 服务器响应 101 Switching Protocols,双方协…

    个人 2025年11月24日
    39900
简体中文 繁体中文 English