Go工程師體系課 protoc-gen-validate【學習筆記】

protoc-gen-validate 簡介與使用指南

✅ 什麼是 protoc-gen-validate

protoc-gen-validate(簡稱 PGV)是一個 Protocol Buffers 外掛程式(plugin),用於**在產生的 Go 程式碼中新增結構體(struct)欄位的驗證邏輯**。

它透過在 .proto 檔案中新增 validate 規則,自動為每個欄位產生驗證程式碼,避免你手動撰寫驗證邏輯。


🌟 範例

syntax = "proto3";

import "validate/validate.proto";

message User {
  string name = 1 [(validate.rules).string.min_len = 3];
  int32 age = 2 [(validate.rules).int32.gte = 18];
}

產生後的 Go 程式碼中會自動包含:

user := &User{Name: "Tom", Age: 16}
if err := user.Validate(); err != nil {
    // err 會指出字段不符合要求
}

✅ 支援的驗證規則類型

  • string: min_len, max_len, email, ip, uri, pattern
  • number: gte, lte, lt, gt
  • repeated: min_items, unique, items rules
  • map: min_pairs, keys rules, values rules
  • message: 巢狀驗證
  • oneof: 子欄位驗證
  • required: 欄位是否必須

✅ 支援語言

  • Go(官方最強支援)
  • C++
  • Java
  • Python
  • C#
  • Rust(透過社群外掛程式)

✅ 成熟度與使用建議

項目 說明
成熟度 非常成熟,在許多微服務(microservice)專案中廣泛使用(如 buf.build 生態系)
社群支援 擁有活躍社群,已由原始作者轉移到 bufbuild 維護
與其他工具相容 完美支援 protoc-gen-go,可搭配 buf, grpc-gateway, govalidator 等使用
適用情境 伺服器端欄位校驗、API 請求校驗、微服務(microservice)介面參數校驗

🛠 使用步驟(簡要)

  1. 安裝外掛程式:
go install github.com/bufbuild/protoc-gen-validate@latest
  1. 下載 PGV 所需的 proto 檔案定義:
git clone https://github.com/bufbuild/protoc-gen-validate

或使用 buf registry 引用:buf.build/buf/validate

  1. 編譯指令:
protoc \
  --proto_path=./proto \
  --go_out=. \
  --go-grpc_out=. \
  --validate_out=lang=go:. \
  your_file.proto

📦 常見替代方案

工具 簡介
cel Google 出品的表達式語言,可用於 proto 校驗,但複雜度略高
手動撰寫驗證 彈性但重複性高,容易出錯
go-playground/validator 通用 Go struct 校驗工具,不依賴 proto

✅ 總結

protoc-gen-validate 是一個**成熟、穩定、易用**的 protobuf 欄位驗證方案,特別適合:

  • 微服務(microservice)架構中的參數校驗
  • 自動產生驗證邏輯
  • 希望減少手動撰寫重複驗證的專案團隊

主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://www.walker-learn.xyz/archives/4461

(0)
Walker的頭像Walker
上一篇 2025年11月25日 17:00
下一篇 2025年11月24日 00:00

相關推薦

  • TS珠峯 004【學習筆記】

    類型體操 type-1 // 內建 // Partial Required Readonly 修飾類型的 // Pick Omit 處理資料結構 // Exclude Extract 處理集合類型的 // Parameters ReturnType infer // 字串類型,樣板字串`${}` + infer PartialPropsOptional …

    個人 2025年3月27日
    1.5K00
  • Go工程師體系課 006【學習筆記】

    專案結構說明:user-web 模組 user-web 是 joyshop_api 專案中的使用者服務 Web 層模組,負責處理使用者相關的 HTTP 請求、參數驗證、業務路由以及呼叫後端介面等功能。以下是目錄結構說明: user-web/ ├── api/ # 控制器層,定義業務介面處理邏輯 ├── config/ # 配置模組,包含系統配置結構體及讀取邏輯 …

    個人 2025年11月25日
    30400
  • 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
  • Go工程師體系課 011【學習筆記】

    查詢的倒排索引 1. 什麼是倒排索引? 倒排索引(Inverted Index)是一種資料結構,用於快速查找包含特定詞彙的文件。它是搜尋引擎的核心技術之一。 1.1 基本概念 正排索引:文件 ID → 文件內容(詞列表) 倒排索引:詞 → 包含該詞的文件 ID 列表 1.2 為什麼叫"倒排"? 倒排索引將傳統的"文件包含哪些詞"的關係倒轉為"詞出現在哪些文件…

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

    擴展物件的功能 一般物件 具有 JavaScript 物件所有預設內部行為的 特殊物件 具有某些與預設行為不符的內部行為 標準物件 在 ES6 規範中定義的物件,例如 Array/Date 等 內建物件 腳本開始執行時存在於 JavaScript 執行環境的物件,所有標準物件都是內建物件 物件字面值語法擴展 屬性初始值的簡寫,當一個物件的屬性與區域變數同名時,不必再寫冒號和值 物件方法的簡寫語法…

    個人 2025年3月8日
    1.4K00
簡體中文 繁體中文 English