> web中經常會用到參數綁定以及表單自動驗證功能,可以節約大量的重復勞動以及提高可維護性
[TOC]
## 示例代碼
~~~
package main
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
)
// User 中包含了綁定的表單請求字段和驗證規則
type User struct {
Username string `form:"username" binding:"required,NameValid"`
Password string `form:"password" binding:"required,gt=5,lt=10"`
}
// 自定義驗證器
var NameValid validator.Func = func(fl validator.FieldLevel) bool {
s, ok := fl.Field().Interface().(string)
if ok {
if s == "admin" {
return false
}
}
return true
}
func TestValidate(c *gin.Context) {
var user User
if err := c.ShouldBindWith(&user, binding.Query); err == nil {
c.JSON(http.StatusOK, gin.H{"message": "通過校驗!", "username": user.Username})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
func main() {
route := gin.Default()
// 注冊新的自定義驗證規則
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
if err := v.RegisterValidation("NameValid", NameValid); err != nil {
panic("-----> validate[NameValid] binding failed")
}
}
// 訪問地址:http://localhost:8080/TestValidate?username=admin&password=123
route.GET("/TestValidate", TestValidate)
route.Run(":8080")
}
~~~
> 訪問 http://localhost:8080/TestValidate?username=admin&password=123 進行測試
## 驗證規則
> 更多binding標簽參考:https://godoc.org/github.com/go-playground/validator
標簽 | 說明
---|---
required| 必填
email| 驗證字符串是email格式;例:"email"
url| 這將驗證字符串值包含有效的網址;例:"url"
max| 字符串最大長度;例:"max=20"
min| 字符串最小長度;例:"min=6"
excludesall| 不能包含特殊字符;例:"excludesall=0x2C"//注意這里用十六進制表示
len| 字符長度必須等于n,或者數組、切片、map的len值為n,即包含的項目數;例:"len=6"
eq| 數字等于n,或者或者數組、切片、map的len值為n,即包含的項目數;例:"eq=6"
ne | 數字不等于n,或者或者數組、切片、map的len值不等于為n,即包含的項目數不為n,其和eq相反;例:"ne=6"
gt| 數字大于n,或者或者數組、切片、map的len值大于n,即包含的項目數大于n;例:"gt=6"
gte| 數字大于或等于n,或者或者數組、切片、map的len值大于或等于n,即包含的項目數大于或等于n;例:"gte=6"
lt| 數字小于n,或者或者數組、切片、map的len值小于n,即包含的項目數小于n;例:"lt=6"
lte|數字小于或等于n,或者或者數組、切片、map的len值小于或等于n,即包含的項目數小于或等于n;例:"lte=6"
## 跨字段驗證
標簽 | 說明
---|---
eqfield=Field|必須等于 Field 的值
nefield=Field| 必須不等于 Field 的值
gtfield=Field| 必須大于 Field 的值
gtefield=Field| 必須大于等于 Field 的值
ltfield=Field| 必須小于 Field 的值
ltefield=Field| 必須小于等于 Field 的值
eqcsfield=Other.Field|必須等于 struct Other 中 Field 的值
necsfield=Other.Field|必須不等于 struct Other 中 Field 的值
gtcsfield=Other.Field |必須大于 struct Other 中 Field 的值
gtecsfield=Other.Field| 必須大于等于 struct Other 中 Field 的值
ltcsfield=Other.Field| 必須小于 struct Other 中 Field 的值
ltecsfield=Other.Field| 必須小于等于 struct Other 中 Field 的值
- 基礎知識
- 開發環境
- 包名規則
- 包初始化 (init)
- 基礎數據類型
- 基礎類型轉換
- 格式化輸出
- go指針
- 流程控制語句
- 函數定義
- 匿名函數
- 數組和切片
- map集合
- 結構體
- Interface接口
- 日期處理
- 數學計算
- 正則表達式
- 協程 (并發處理)
- channel
- waitgroup
- mutex (鎖機制)
- websocket
- protobuf
- Redis
- 錯誤處理
- 打包程序
- NSQ消息隊列
- 單元測試
- beego
- 安裝入門
- Gin
- 快速入門
- 路由與控制器
- 處理請求參數
- 表單驗證
- 處理響應結果
- 渲染HTML模版
- 訪問靜態文件
- Gin中間件
- Cookie處理
- Session處理
- Gin上傳文件
- swagger
- pprof性能測試
- GORM
- 入門教程
- 模型定義
- 數據庫連接
- 插入數據
- 查詢數據
- 更新數據
- 刪除數據
- 事務處理
- 關聯查詢
- 屬于 (BELONG TO)
- 一對一 (Has One)
- 一對多 (Has Many)
- 多對多 (Many to Many)
- 預加載 (Preloading)
- 錯誤處理
- 第三方常用插件
- viper 讀取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷鍵