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
上一篇 14小時前
下一篇 2025年3月8日 12:52

相關推薦

  • Go工程師體系課 009

    其它一些功能 個人中心 收藏 管理收貨地址(增刪改查) 留言 拷貝inventory_srv--> userop_srv 查詢替換所有的inventory Elasticsearch 深度解析文檔 1. 什麼是Elasticsearch Elasticsearch是一個基於Apache Lucene構建的分佈式、RESTful搜索和分析引擎,能夠快速地…

    後端開發 8小時前
    100
  • 編程基礎 0010_Go底層原理與源碼精華

    Go 底層原理與源碼精華 基於《Go 源碼剖析》(雨痕, 第五版下冊)、《Go 1.4 runtime》、《Go 學習筆記 第四版》、《Golang 性能優化》、《Go Execution Modes》等資料整理,並補充現代 Go 版本的變化。 一、Go 編譯器與鏈接器 1.1 編譯流程概覽 Go 的編譯過程分爲以下階段: 源碼 (.go) --> 詞…

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

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

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

    其它一些功能 個人中心 收藏 管理收貨地址(增刪改查) 留言 拷貝inventory_srv--> userop_srv 查詢替換所有的inventory Elasticsearch 深度解析文檔 1. 什麼是Elasticsearch Elasticsearch是一個基於Apache Lucene構建的分佈式、RESTful搜索和分析引擎,能夠快速地…

  • Go工程師體系課 016

    Kubernetes 入門 —— Go 微服務部署與編排 一、Kubernetes 核心概念 1.1 什麼是 Kubernetes Kubernetes(簡稱 K8s)是 Google 開源的容器編排平臺,用於自動化部署、擴展和管理容器化應用。如果說 Docker 解決了"如何打包和運行單個容器"的問題,那麼 K8s 解決的是"如何管理成百上千個容器"的問題…

簡體中文 繁體中文 English