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://joyjs.cn/archives/4460

(0)
Walker的头像Walker
上一篇 2025年4月20日 19:12
下一篇 2025年4月27日 15:33

相关推荐

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

    Set集合与Map集合 在js中有g一个in运算符,其不需要读取对象的值就要以判断属性在对象中是否存在,如果存在就返回true。但是in运算符也会检索对象的原型,只有当对象原型为null时使用这个方法才比较稳妥。 Set集合 let set = new Set() set.add(5) set.add("5") console.log(s…

    个人 2025年3月8日
    89800
  • 深入理解ES6 013【学习笔记】

    用模块封装代码 javascript用“共享一切”的方法加载代码,这是该语言中最容易出错且另人感到困惑的地方。其他语言使用诸如包这样的概念来定义代码作用域。在es6以前,在应用程序的每一个js中定义的一切都共享一个全局作用域。随着web应用程序变得更加复杂,js代码的使用量也开始增长,这一做法会引起问题,如命名冲突和安全问题。es6的一个目标是解决作用域问题…

    个人 2025年3月8日
    87300
  • 热爱运动,挑战极限,拥抱自然

    热爱 在这个快节奏的时代,我们被工作、生活的压力所包围,常常忽略了身体的需求。而运动,不仅仅是一种健身方式,更是一种释放自我、挑战极限、与自然共舞的生活态度。无论是滑雪、攀岩、冲浪,还是跑步、骑行、瑜伽,每一种运动都能让我们找到内心的激情,感受到生命的跃动。 运动是一场自我挑战 挑战极限,不仅仅是职业运动员的专属,而是每一个热爱运动的人都可以追求的目标。它可…

    个人 2025年2月26日
    95700
  • TS珠峰 001【学习笔记】

    课程大纲 搭建 TypeScript 开发环境。 掌握 TypeScript 的基础类型,联合类型和交叉类型。 详细类型断言的作用和用法。 掌握 TypeScript 中函数、类的类型声明方式。 掌握类型别名、接口的作用和定义。 掌握泛型的应用场景,熟练应用泛型。 灵活运用条件类型、映射类型与内置类型。 创建和使用自定义类型。 理解命名空间、模块的概念已经使…

    个人 2025年3月27日
    1.2K00
  • TS珠峰 004【学习笔记】

    类型体操 type-1 // 内置 // Partial Required Readonly 修饰类型的 // Pick Omit 处理数据结构 // Exclude Extract 处理集合类型的 // Paramters RetrunValue infer // 字符串类型,模板字符串`${}` + infer PartialPropsOptional …

    个人 2025年3月27日
    1.1K00

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
欢迎🌹 Coding never stops, keep learning! 💡💻 光临🌹