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://walker-learn.xyz/archives/4461

(0)
Walker的頭像Walker
上一篇 2026年3月10日 00:00
下一篇 2026年3月8日 15:40

相關推薦

  • Go工程師體系課 002【學習筆記】

    GOPATH 與 Go Modules 的差異 1. 概念 GOPATH 是 Go 早期使用的依賴管理機制。 所有的 Go 專案和依賴套件都必須放在 GOPATH 目錄中(預設是 ~/go)。 一定要設定 GO111MODULE=off 專案路徑必須按照 src/套件名稱 的結構來組織。 不支援版本控制,依賴管理需要手動處理(例如 go get)。 尋找依賴套件的順序是 g…

    2025年11月25日
    29600
  • Go工程師體系課 017【學習筆記】

    限流、熔斷與降級入門(含 Sentinel 實戰) 結合課件第 3 章(3-1 ~ 3-9)的影片要點,整理一套面向初學者的服務保護指南,幫助理解「為什麼需要限流、熔斷和降級」,以及如何用 Sentinel 快速上手。 學習路線速覽 3-1 理解服務雪崩與限流、熔斷、降級的背景 3-2 Sentinel 與 Hystrix 對比,明確技術選型 3-3 Sen…

    個人 2025年11月25日
    24200
  • 【開篇】

    我是Walker,生於八十年代初,程式碼與生活的旅者。全端開發工程師,遊走於前端與後端的邊界,執著於技術與藝術的交會點。程式碼,是我編織夢想的語言;專案,是我刻畫未來的畫布。在鍵盤的敲擊聲中,我探索技術的無限可能,讓靈感在程式碼裡永恆綻放。深度咖啡愛好者,迷戀每一杯手沖的詩意與儀式感。在咖啡的醇香與苦澀中,尋找專注與靈感,亦如在開發的世界中追求極致與平衡。騎…

    2025年2月6日 個人
    2.3K00
  • 無畏前行,拳釋力量 🥊💪

    拚搏,是一種態度。生活就像一場比賽,沒有捷徑可走,只有不斷訓練、突破、超越,才能站上屬於自己的舞台。這不僅是一種對抗,更是一種自我的覺醒——敢於迎戰,敢於挑戰,敢於成為更強的自己。 運動中的拚搏精神 無論是拳擊、跑步,還是力量訓練,每一次出拳、每一次揮汗、每一次咬牙堅持,都是對身體與心靈的磨練。拚搏不是單純的對抗,而是一種態度——面對挑戰,不退縮;面對失敗,…

    個人 2025年2月26日
    1.4K00
  • Node深入淺出(聖思園教育) 001【學習筆記】

    node 從非同步程式設計典範理解 Node.js Node.js 的定位與核心思想 基於 V8 引擎 + libuv 事件驅動函式庫,將 JavaScript 從瀏覽器帶到伺服器端。 採用單執行緒事件迴圈處理 I/O,最大化利用 CPU 等待 I/O 的時間切片,特別適合高併發、I/O 密集型情境。 「不要阻塞主執行緒」是設計哲學:盡量把耗時操作交給核心或執行緒池,回呼結果…

    個人 2025年11月24日
    34500
簡體中文 繁體中文 English