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://www.walker-learn.xyz/archives/4460

(0)
Walker的头像Walker
上一篇 2025年4月20日 19:12
下一篇 2025年11月25日 16:00

相关推荐

  • 深入理解ES6 001【学习笔记】

    块级作用域绑定 之前的变量声明var无论在哪里声明的都被认为是作域顶部声明的,由于函数是一等公民,所以顺序一般是function 函数名()、var 变量。 块级声明 块级声明用于声明在指定块的作用域之外无法访问的变量。块级作用域存在于: 函数内部 块中(字符和{和}之间的区域) 临时死区 javascript引擎在扫描代码发现变量声明时,要么将它们提升至作…

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

    grpc grpc grpc-go grpc 无缝集成了 protobuf protobuf 习惯用 Json、XML 数据存储格式的你们,相信大多都没听过 Protocol Buffer。 Protocol Buffer 其实是 Google 出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 真的强!太!多! protobuf…

    个人 2025年11月25日
    27700
  • TS珠峰 002【学习笔记】

    泛型 /* * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git &a…

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

    node 的包管理机制和加载机制 npm search xxxnpm view xxxnpm install xxx nodejs 文件系统操作的 api Node.js 的 fs 模块提供同步(Sync)与基于回调/Promise 的异步 API,可以操作本地文件与目录。日常开发中常用的能力包括读取、写入、追加、删除、遍历目录、监听变化等。以下示例基于 C…

    个人 2025年11月24日
    32100
  • Go工程师体系课 018【学习笔记】

    API 网关与持续部署入门(Kong & Jenkins) 对应资料目录《第 2 章 Jenkins 入门》《第 3 章 通过 Jenkins 部署服务》,整理 Kong 与 Jenkins 在企业级持续交付中的实战路径。即便零基础,也能顺着步骤搭建出自己的网关 + 持续部署流水线。 课前导览:什么是 API 网关 API 网关位于客户端与后端微服务…

    个人 2025年11月25日
    26700
简体中文 繁体中文 English