gorm 結構體中 binding 和 msg 結構體標簽示例詳解
binding 和 msg 是結構體標簽(struct tags),主要用于數(shù)據(jù)驗證和錯誤信息提示。它們通常與 Gin 框架的 ShouldBindJSON 配合使用,以及用于處理表單驗證。
下面詳細解釋:
基本用法示例:
type LoginForm struct {
Username string `json:"username" binding:"required" msg:"用戶名不能為空"`
Password string `json:"password" binding:"required,min=6" msg:"密碼不能為空且長度至少6位"`
Age int `json:"age" binding:"required,gte=18" msg:"年齡必須大于或等于18歲"`
Email string `json:"email" binding:"required,email" msg:"請輸入有效的郵箱地址"`
}在 Gin 中使用:
func Login(c *gin.Context) {
var form LoginForm
if err := c.ShouldBindJSON(&form); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
// 處理登錄邏輯...
}常用的 binding 驗證規(guī)則:
type User struct {
// required: 必填
Name string `binding:"required"`
// min,max: 字符串長度或數(shù)字范圍
Password string `binding:"min=6,max=20"`
// email: 郵箱格式
Email string `binding:"email"`
// oneof: 枚舉值
Role string `binding:"oneof=admin user guest"`
// gte,lte: 大于等于,小于等于
Age int `binding:"gte=18,lte=100"`
// url: URL格式
Website string `binding:"url"`
// 正則表達式
Phone string `binding:"required,regexp=^1[3-9]\\d{9}$"`
}自定義驗證器:
type RegisterForm struct {
Password string `binding:"required,CustomPassword"`
Phone string `binding:"required,CustomPhone"`
}
func customValidator() {
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// 注冊自定義驗證器
v.RegisterValidation("CustomPassword", ValidatePassword)
v.RegisterValidation("CustomPhone", ValidatePhone)
}
}
func ValidatePassword(fl validator.FieldLevel) bool {
password := fl.Field().String()
// 自定義密碼驗證邏輯
return len(password) >= 8
}使用 msg 標簽自定義錯誤信息:
type CreateUserForm struct {
Username string `json:"username" binding:"required" msg:"用戶名不能為空"`
Password string `json:"password" binding:"required,min=6" msg:"密碼長度最少6位"`
}
// 處理錯誤信息的輔助函數(shù)
func getValidMsg(err error, obj interface{}) string {
// 通過反射獲取 struct 類型
getObj := reflect.TypeOf(obj)
// 如果是指針,則獲取其基礎類型
if getObj.Kind() == reflect.Ptr {
getObj = getObj.Elem()
}
// 將錯誤信息轉換為驗證器錯誤
if errs, ok := err.(validator.ValidationErrors); ok {
// 遍歷每一個錯誤
for _, e := range errs {
// 獲取對應字段
if f, exist := getObj.FieldByName(e.Field()); exist {
// 獲取 msg 標簽內(nèi)容
msg := f.Tag.Get("msg")
if msg != "" {
return msg
}
}
}
}
return err.Error()
}在控制器中使用:
func CreateUser(c *gin.Context) {
var form CreateUserForm
if err := c.ShouldBindJSON(&form); err != nil {
// 獲取自定義錯誤信息
errMsg := getValidMsg(err, form)
c.JSON(400, gin.H{"error": errMsg})
return
}
// 處理業(yè)務邏輯...
}組合驗證規(guī)則:
type Product struct {
// 多個驗證規(guī)則用逗號分隔
Name string `binding:"required,min=2,max=50" msg:"產(chǎn)品名稱長度必須在2-50之間"`
Price float64 `binding:"required,gte=0" msg:"價格必須大于或等于0"`
// 條件驗證:當 Status 為 "active" 時,Description 必填
Status string `binding:"required,oneof=active inactive" msg:"狀態(tài)必須是 active 或 inactive"`
Description string `binding:"required_if=Status active" msg:"當狀態(tài)為active時,描述必填"`
}跨字段驗證:
type ChangePassword struct {
Password string `binding:"required" msg:"密碼不能為空"`
ConfirmPassword string `binding:"required,eqfield=Password" msg:"兩次輸入的密碼不一致"`
}初始化驗證器:
func InitValidator() {
// 注冊驗證器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// 注冊自定義驗證器
v.RegisterValidation("custom_validation", CustomValidationFunc)
// 注冊自定義錯誤信息翻譯器
zhTranslations.RegisterDefaultTranslations(v, trans)
}
}這些標簽主要用于:
- 數(shù)據(jù)驗證(binding)
- 自定義錯誤信息(msg)
- 參數(shù)綁定
- 表單驗證
- API 接口參數(shù)驗證
通過合理使用這些標簽,可以:
- 減少手動編寫驗證代碼
- 提供更友好的錯誤提示
- 確保數(shù)據(jù)的完整性和有效性
- 提高代碼的可維護性
到此這篇關于gorm 結構體中 binding 和 msg 結構體標簽的文章就介紹到這了,更多相關gorm binding 和 msg 結構體標簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言中處理JSON數(shù)據(jù)的編碼和解碼的方法
在Go語言中,處理JSON數(shù)據(jù)的編碼和解碼主要依賴于標準庫中的encoding/json包,這個包提供了兩個核心的函數(shù):Marshal和Unmarshal,本文給大家介紹了Go語言中處理JSON數(shù)據(jù)的編碼和解碼的方法,需要的朋友可以參考下2024-04-04
golang將切片或數(shù)組根據(jù)某個字段進行分組操作
這篇文章主要介紹了golang將切片或數(shù)組根據(jù)某個字段進行分組操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題)
這篇文章主要介紹了VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
解決golang sync.Wait()不執(zhí)行的問題
這篇文章主要介紹了解決golang sync.Wait()不執(zhí)行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

