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/6725

(0)
Walker的頭像Walker
上一篇 12小時前
下一篇 2025年3月8日 12:52

相關推薦

  • Go工程師體系課 010

    es 安裝 elasticsearch(理解為庫) kibana(理解為連接工具)es 和 kibana(5601) 的版本要保持一致 MySQL 對照學習 Elasticsearch(ES) 術語對照 MySQL Elasticsearch database index(索引) table type(7.x 起固定為 _doc,8.x 徹底移除多 type…

    後端開發 5小時前
    100
  • Go資深工程師講解(慕課) 004

    004 goroutine package main import ( "fmt" "time" ) func main() { for i:=0;i<10;i++{ go func(i int) { fmt.Printf("Hello from goroutine %d \n",i) // …

    後端開發 23小時前
    100
  • Go工程師體系課 015

    Docker 容器化 —— Go 項目實戰指南 一、Docker 核心概念 1.1 甚麼是 Docker Docker 是一個開源的容器化平台,它可以將應用程序及其所有依賴項打包到一個標準化的單元(容器)中,從而實現"一次構建,到處運行"。對於 Go 開發者而言,Docker 解決了以下痛點: 開發環境與生產環境不一致 依賴管理複雜(數據庫、緩存、消息隊列等…

    後端開發 25分鐘前
    000
  • Go工程師體系課 004

    需求分析 後台管理系統 商品管理 商品列表 商品分類 品牌管理 品牌分類 訂單管理 訂單列表 用戶信息管理 用戶列表 用戶地址 用戶留言 輪播圖管理 電商系統 登錄頁面 首頁 商品搜索 商品分類導航 輪播圖展示 推薦商品展示 商品詳情頁 商品圖片展示 商品描述 商品規格選擇 加入購物車 購物車 商品列表 數量調整 刪除商品 結算功能 用戶中心 訂單中心 我的…

    1天前
    100
  • 編程基礎 0011_Go併發與分布式實戰精華

    Go 併發與分布式實戰精華 參考:《Go 併發編程實戰》(郝林)、《Mastering Concurrency in Go》(Nathan Kozyra)、《Go 語言構建高併發分布式系統實踐》 1. 併發原語深入 1.1 atomic 包 atomic 操作直接映射到 CPU 指令(如 LOCK CMPXCHG),比 mutex 快一個數量級。 impor…

    後端開發 19小時前
    100
簡體中文 繁體中文 English