寫程式就像開遊樂園大門口 🎡。
大家都想衝進去玩雲霄飛車,可是一定要有「保全大哥」檢查門票,才能確保進來的人符合規定。
在 Go 語言裡,我們的保全大哥就是—— go-playground/validator 套件 👮♂️。
為什麼要驗證?
想像一下,你做了一個「線上報名表單」,結果有人亂填:
名字:;;;;;
Email:我是小可愛
年齡:99999
這些奇怪資料如果直接塞進資料庫,會怎樣?
答:你的系統會亂成垃圾堆 🗑️,就像雜貨店被人拿來丟廚餘。
所以 驗證(Validation) 的任務,就是在「門口」先把這些怪東西擋掉,讓系統保持乾淨 ✨。
安裝 validator
只要在專案資料夾輸入:
go get github.com/go-playground/validator/v10
就能下載這個保全大哥上班啦 🚪👮。
基本使用
先來看最基本的「使用者註冊」規則:
Name 不能空白 ❌
Email 必須是真的 Email 格式 📧
程式碼:
package main
import (
"net/http"
"github.com/go-playground/validator/v10"
"github.com/labstack/echo/v4"
)
type User struct {
Name string `json:"name" validate:"required"`
Email string `json:"email" validate:"required,email"`
}
var validate = validator.New()
func main() {
e := echo.New()
e.POST("/register", func(c echo.Context) error {
var user User
if err := c.Bind(&user); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{"error": "資料格式錯誤"})
}
// 驗證
if err := validate.Struct(user); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Error()})
}
return c.JSON(http.StatusOK, map[string]string{"message": "註冊成功!"})
})
e.Logger.Fatal(e.Start(":8080"))
}
關鍵在這行:
validate.Struct(user)
它會幫你把 User struct 掃過一遍,違規就直接抓 🚨。
測試情境
情境一:名字空白
傳送:
{
"name": "",
"email": "test@gmail.com"
}
回傳:
{
"error": "Key: 'User.Name' Error:Field validation for 'Name' failed on the 'required' tag"
}
保全大哥:名字不能空白啦! 🙅♂️
情境二:Email 格式錯誤
傳送:
{
"name": "小明",
"email": "not-an-email"
}
回傳:
{
"error": "Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag"
}
保全大哥:這不是合法的 Email 格式 📛!
情境三:通過驗證
傳送:
{
"name": "小明",
"email": "xiaoming@gmail.com"
}
回傳:
{
"message": "註冊成功!"
}
✅ 恭喜,這次大哥放你進來啦!
更多規則貼紙 🎟️
validator 規則超多,就像玩「貼紙遊戲」一樣,把規則貼在欄位上:
type Product struct {
Name string `json:"name" validate:"required"`
Price float64 `json:"price" validate:"gt=0"`
Stock int `json:"stock" validate:"min=1,max=100"`
}
規則解釋:
gt=0:價格必須大於 0 💰
min=1,max=100:庫存要在 1 到 100 之間 📦
測試:
{
"name": "蘋果",
"price": -10,
"stock": 200
}
回傳:
{
"error": "Key: 'Product.Price' Error:Field validation for 'Price' failed on the 'gt' tag\nKey: 'Product.Stock' Error:Field validation for 'Stock' failed on the 'max' tag"
}
保全大哥:
你不能自己倒貼 10 塊啦 💸!
庫存也太多了,你是要開水果倉庫嗎 🍎🏭?
自訂錯誤訊息 📝
預設錯誤訊息有點「工程師味」,一般人可能看不懂 🤯。
我們可以自己寫比較友善的訊息:
if err := validate.Struct(product); err != nil {
for _, err := range err.(validator.ValidationErrors) {
switch err.Tag() {
case "required":
return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Field() + " 是必填欄位"})
case "gt":
return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Field() + " 必須大於 0"})
case "max":
return c.JSON(http.StatusBadRequest, map[string]string{"error": err.Field() + " 不能超過 100"})
}
}
}
這樣,錯誤就會更貼近人話,讓使用者秒懂 👌。
小結 🎯
到這裡,我們學到:
✅ 安裝並使用 validator
✅ 在 struct 欄位加規則貼紙
✅ 自動驗證請求資料
✅ 自訂錯誤訊息,讓回覆更人性化
簡單來說:validator 就像夜市的保全大哥,把亂七八糟的客人擋在門外,讓系統裡面乾淨安全 🛡️✨。