[TOC]
# 驗證函數
StructTag 可用的驗證函數:
* `Required`不為空,即各個類型要求不為其零值
* `Min(min int)`最小值,有效類型:`int`,其他類型都將不能通過驗證
* `Max(max int)`最大值,有效類型:`int`,其他類型都將不能通過驗證
* `Range(min, max int)`數值的范圍,有效類型:`int`,他類型都將不能通過驗證
* `MinSize(min int)`最小長度,有效類型:`string slice`,其他類型都將不能通過驗證
* `MaxSize(max int)`最大長度,有效類型:`string slice`,其他類型都將不能通過驗證
* `Length(length int)`指定長度,有效類型:`string slice`,其他類型都將不能通過驗證
* `Alpha`alpha字符,有效類型:`string`,其他類型都將不能通過驗證
* `Numeric`數字,有效類型:`string`,其他類型都將不能通過驗證
* `AlphaNumeric`alpha 字符或數字,有效類型:`string`,其他類型都將不能通過驗證
* `Match(pattern string)`正則匹配,有效類型:`string`,其他類型都將被轉成字符串再匹配(fmt.Sprintf(“%v”, obj).Match)
* `AlphaDash`alpha 字符或數字或橫杠`-_`,有效類型:`string`,其他類型都將不能通過驗證
* `Email`郵箱格式,有效類型:`string`,其他類型都將不能通過驗證
* `IP`IP 格式,目前只支持 IPv4 格式驗證,有效類型:`string`,其他類型都將不能通過驗證
* `Base64`base64 編碼,有效類型:`string`,其他類型都將不能通過驗證
* `Mobile`手機號,有效類型:`string`,其他類型都將不能通過驗證
* `Tel`固定電話號,有效類型:`string`,其他類型都將不能通過驗證
* `Phone`手機號或固定電話號,有效類型:`string`,其他類型都將不能通過驗證
* `ZipCode`郵政編碼,有效類型:`string`,其他類型都將不能通過驗證
# 函數驗證
~~~
type User struct {
Name string
Age int
}
func (this *AdminController) Post(){
fmt.Println("=============tttt===============")
u := User{"man", 240}
valid := validation.Validation{}
valid.Required(u.Name, "name")
valid.MaxSize(u.Name, 15, "nameMax")
valid.Range(u.Age, 0, 18, "age")
// 定制錯誤信息
minAge := 18
valid.Min(u.Age, minAge, "age").Message("少兒不宜!")
// 錯誤信息格式化
valid.Min(u.Age, minAge, "age").Message("%d不禁", minAge)
if valid.HasErrors() {
// 如果有錯誤信息,證明驗證沒通過
// 打印錯誤信息
for _, err := range valid.Errors {
fmt.Println("---錯誤的key---", err.Key)
fmt.Println(err.Key, err.Message)
}
}
// or use like this
if v := valid.Max(u.Age, 140, "age"); !v.Ok {
fmt.Println("---錯誤的key---", v.Error.Key)
fmt.Println(v.Error.Key, v.Error.Message)
}
fmt.Println("=============tttt===============")
this.Ctx.WriteString("-------test----------")
}
~~~
# struct驗證
~~~
// 驗證函數寫在 "valid" tag 的標簽里
// 各個函數之間用分號 ";" 分隔,分號后面可以有空格
// 參數用括號 "()" 括起來,多個參數之間用逗號 "," 分開,逗號后面可以有空格
// 正則函數(Match)的匹配模式用兩斜杠 "/" 括起來
// 各個函數的結果的 key 值為字段名.驗證函數名
type user struct {
Id int
Name string `valid:"Required;Match(/^Bee.*/)"` // Name 不能為空并且以 Bee 開頭
Age int `valid:"Range(1, 140)"` // 1 <= Age <= 140,超出此范圍即為不合法
Email string `valid:"Email; MaxSize(100)"` // Email 字段需要符合郵箱格式,并且最大長度不能大于 100 個字符
Mobile string `valid:"Mobile"` // Mobile 必須為正確的手機號
IP string `valid:"IP"` // IP 必須為一個正確的 IPv4 地址
}
// 如果你的 struct 實現了接口 validation.ValidFormer
// 當 StructTag 中的測試都成功時,將會執行 Valid 函數進行自定義驗證
func (u *user) Valid(v *validation.Validation) {
if strings.Index(u.Name, "admin") != -1 {
// 通過 SetError 設置 Name 的錯誤信息,HasErrors 將會返回 true
v.SetError("Name", "名稱里不能含有 admin")
}
}
func (this *AdminController) Post() {
fmt.Println("=============tttt===============")
valid := validation.Validation{}
u := user{Name: "Beego", Age: 2, Email: "dev@beego.me"}
b, err := valid.Valid(&u)
if err != nil {
// handle error,這個一般沒有
fmt.Println("有錯誤----111-----")
}
if !b {
// validation does not pass
// blabla...
for _, err := range valid.Errors {
fmt.Println(err.Key, err.Message)
fmt.Println("有錯誤----222-----")
}
}
fmt.Println("=============tttt===============")
this.Ctx.WriteString("-------test----------")
}
~~~
- 基礎
- 簡介
- 主要特征
- 變量和常量
- 編碼轉換
- 數組
- byte與rune
- big
- sort接口
- 和mysql類型對應
- 函數
- 閉包
- 工作區
- 復合類型
- 指針
- 切片
- map
- 結構體
- sync.Map
- 隨機數
- 面向對象
- 匿名組合
- 方法
- 接口
- 權限
- 類型查詢
- 異常處理
- error
- panic
- recover
- 自定義錯誤
- 字符串處理
- 正則表達式
- json
- 文件操作
- os
- 文件讀寫
- 目錄
- bufio
- ioutil
- gob
- 棧幀的內存布局
- shell
- 時間處理
- time詳情
- time使用
- new和make的區別
- container
- list
- heap
- ring
- 測試
- 單元測試
- Mock依賴
- delve
- 命令
- TestMain
- path和filepath包
- log日志
- 反射
- 詳解
- plugin包
- 信號
- goto
- 協程
- 簡介
- 創建
- 協程退出
- runtime
- channel
- select
- 死鎖
- 互斥鎖
- 讀寫鎖
- 條件變量
- 嵌套
- 計算單個協程占用內存
- 執行規則
- 原子操作
- WaitGroup
- 定時器
- 對象池
- sync.once
- 網絡編程
- 分層模型
- socket
- tcp
- udp
- 服務端
- 客戶端
- 并發服務器
- Http
- 簡介
- http服務器
- http客戶端
- 爬蟲
- 平滑重啟
- context
- httptest
- 優雅中止
- web服務平滑重啟
- beego
- 安裝
- 路由器
- orm
- 單表增刪改查
- 多級表
- orm使用
- 高級查詢
- 關系查詢
- SQL查詢
- 元數據二次定義
- 控制器
- 參數解析
- 過濾器
- 數據輸出
- 表單數據驗證
- 錯誤處理
- 日志
- 模塊
- cache
- task
- 調試模塊
- config
- 部署
- 一些包
- gjson
- goredis
- collection
- sjson
- redigo
- aliyunoss
- 密碼
- 對稱加密
- 非對稱加密
- 單向散列函數
- 消息認證
- 數字簽名
- mysql優化
- 常見錯誤
- go run的錯誤
- 新手常見錯誤
- 中級錯誤
- 高級錯誤
- 常用工具
- 協程-泄露
- go env
- gometalinter代碼檢查
- go build
- go clean
- go test
- 包管理器
- go mod
- gopm
- go fmt
- pprof
- 提高編譯
- go get
- 代理
- 其他的知識
- go內存對齊
- 細節總結
- nginx路由匹配
- 一些博客
- redis為什么快
- cpu高速緩存
- 常用命令
- Go 永久阻塞的方法
- 常用技巧
- 密碼加密解密
- for 循環迭代變量
- 備注
- 垃圾回收
- 協程和纖程
- tar-gz
- 紅包算法
- 解決golang.org/x 下載失敗
- 逃逸分析
- docker
- 鏡像
- 容器
- 數據卷
- 網絡管理
- 網絡模式
- dockerfile
- docker-composer
- 微服務
- protoBuf
- GRPC
- tls
- consul
- micro
- crontab
- shell調用
- gorhill/cronexpr
- raft
- go操作etcd
- mongodb