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
上一篇 2025年11月24日 02:00
下一篇 2025年11月25日 08:00

相關推薦

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

    訂單事務 先扣庫存 後扣庫存 都會對庫存和訂單都會有影響,所以要使用分散式事務 業務(下單不對付)業務問題 支付成功再扣減(下單了,支付時沒庫存了) 訂單扣減,不支付(訂單超時歸還)【常用方式】 事務和分散式事務 1. 什麼是事務? 事務(Transaction)是資料庫管理系統中的一個重要概念,它是一組資料庫操作的集合,這些操作要麼全部成功執行,要麼全部…

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

    改進的陣列功能 new Array() 的怪異行為,當建構函式傳入一個數值型的值,那麼陣列的 length 屬性會被設為該值;如果傳入多個值,此時無論這些值是不是數值型的,都會變為陣列的元素。這個特性令人困惑,你不可能總是注意傳入資料的類型,所以存在一定的風險。 Array.of() 無論傳多少個參數,不存在單一數值的特例(一個參數且數值型),總是返回包含所有參數…

    個人 2025年3月8日
    1.3K00
  • 熱愛運動,挑戰極限,擁抱自然

    熱愛 在這個快節奏的時代,我們被工作、生活的壓力所包圍,常常忽略了身體的需求。而運動,不只是一種健身方式,更是一種釋放自我、挑戰極限、與自然共舞的生活態度。無論是滑雪、攀岩、衝浪,還是跑步、騎行、瑜伽,每一種運動都能讓我們找到內心的激情,感受到生命的躍動。 運動是一場自我挑戰。挑戰極限,不只是職業運動員的專屬,而是每一個熱愛運動的人都可以追求的目標。它可…

    個人 2025年2月26日
    1.5K00
  • Go工程師體系課 007【學習筆記】

    商品微服務 實體結構說明 本模組包含以下核心實體: 商品(Goods) 商品分類(Category) 品牌(Brands) 輪播圖(Banner) 品牌分類(GoodsCategoryBrand) 1. 商品(Goods) 描述平台中實際展示和銷售的商品資訊。 欄位說明 欄位名 類型 說明 name String 商品名稱,必填 brand Pointer …

    個人 2025年11月25日
    33100
  • Nuxt3_掃盲 入門與原理介紹【學習筆記】

    Nuxt 3 入門與原理介紹 💡 什麼是 Nuxt 3? Nuxt 3 是基於 Vue 3 和 Vite 打造的全端前端框架,支援: 伺服器端渲染(SSR) 靜態網站生成(SSG) 單頁應用程式(SPA) 建構全端應用程式(支援 API) Nuxt 3 是 Vue 的「加強版」,幫你簡化專案結構與開發流程。 🔧 核心原理 功能 Nuxt 如何處理 ✅ 頁面路由 自動根…

    個人 2025年4月6日
    2.2K00
簡體中文 繁體中文 English