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
上一篇 2025年4月20日 19:12
下一篇 2025年11月25日 16:00

相關推薦

  • 深入理解ES6 011【學習筆記】

    Promise與異步程式設計 因為執行引擎是單執行緒的,所以需要追蹤即將執行的程式碼,那些程式碼會被放在一個任務佇列中,每當一段程式碼準備執行時,都會被新增到任務佇列中,每當引擎中的一段程式碼結束執行時,事件迴圈會執行佇列中的下一個任務。 Promise 相當於異步操作結果的佔位符,它不會去訂閱一個事件,也不會傳遞一個回呼函式給目標函式,而是讓函式回傳一個 Promise,就像這樣…

    個人 2025年3月8日
    1.1K00
  • Go工程師體系課 018【學習筆記】

    API 閘道與持續部署入門(Kong & Jenkins) 對應資料目錄《第 2 章 Jenkins 入門》《第 3 章 透過 Jenkins 部署服務》,整理 Kong 與 Jenkins 在企業級持續交付中的實戰路徑。即使零基礎,也能順著步驟建立出自己的閘道 + 持續部署管線。 課前導覽:什麼是 API 閘道 API 閘道位於用戶端與後端微服務…

    個人 2025年11月25日
    19000
  • 深入理解ES6 001【學習筆記】

    區塊作用域繫結 之前的變數宣告 `var` 無論在哪裡宣告,都會被視為作用域頂部宣告。由於函式是一等公民,因此順序通常是 `function 函式名稱()`、`var 變數`。 區塊宣告 區塊宣告用於宣告在指定區塊的作用域之外無法存取的變數。區塊作用域存在於: 函式內部 區塊中(字元 `{` 和 `}` 之間的區域) 暫時性死區 JavaScript 引擎在掃描程式碼發現變數宣告時,要麼會將它們提升至作…

    個人 2025年3月8日
    1.6K00
  • Go 工程師體系課 010【學習筆記】

    安裝 Elasticsearch (可理解為資料庫) 和 Kibana (可理解為連接工具)。Elasticsearch 和 Kibana (5601) 的版本必須保持一致。MySQL 對照學習 Elasticsearch (ES) 術語對照:MySQL 的 database 對應 Elasticsearch 的 index (索引);MySQL 的 table 對應 Elasticsearch 的 type (從 7.x 版起固定為 _doc,8.x 版徹底移除多個類型…

    個人 2025年11月25日
    32400
  • Go 工程師體系課 014【學習筆記】

    rocketmq 快速入門 請參考我們的各種配置(podman)以瞭解安裝方式。概念介紹 RocketMQ 是阿里巴巴開源、Apache 頂級專案的分散式訊息中介軟體,核心元件: NameServer:服務發現與路由 Broker:訊息儲存、遞送、拉取 Producer:訊息生產者(傳送訊息) Consumer:訊息消費者(訂閱並消費訊息) Topic/Tag:主題/…

    個人 2025年11月25日
    16700
簡體中文 繁體中文 English
歡迎🌹 Coding never stops, keep learning! 💡💻 光臨🌹