日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 自定义validate_Golang-03 自定义validator,实现java注解功能-Go语言中文社区

發布時間:2025/3/21 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 自定义validate_Golang-03 自定义validator,实现java注解功能-Go语言中文社区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0x00 About

接口開發中, 比較常用的操作就是對輸入的參數Bean進行字段屬性值校驗.

在Java中, 有Annotation(注解)可以讓我們方便的在的類上面添加校驗信息,

那么在Go中應該如何做到這一點呢?

0x01 structTag

StructType = "struct" "{" { FieldDecl ";" } "}" .

FieldDecl = (IdentifierList Type | EmbeddedField) [ Tag ] .

EmbeddedField = [ "*" ] TypeName .

Tag = string_lit .

也就是說, struct字段的后面, 可以添加一個字符串, 稱之為Tag

然后, 通過go語言中的reflect反射機制, 就可以讀取相應字段的Tag信息了.

接下來, 找一段代碼直觀感受一下:

type InParam struct {

StudentName string `json:"name" cc:"str,min=5,max=15"`

Score int `json:"score" cc:"num,min=0,max=100"`

}

package main

import (

"fmt"

"reflect"

)

func main() {

t := reflect.TypeOf(&InParam{"18", 25})

field := t.Elem().Field(0)

jsonName := field.Tag.Get("json")

cc := field.Tag.Get("cc")

fmt.Printf("%s(%s): %s", field.Name, jsonName, cc)

}

輸出結果:

StudentName(name): str,min=5,max=15

需要注意的地方: reflect.TypeOf 的參數只能接入對象.

0x02 Validator

那么接下來的工作, 就是根據Tag內容開發一個公共函數.

這里提供了兩種驗證器:string和number, 分別驗證其長度范圍和取值范圍.

package main

import (

"fmt"

"reflect"

"strings"

)

// 定義接口

type CCValid interface {

Validate(interface{}) (bool, error)

}

// 定義三個驗證器

type CCDefaultValid struct {

}

type CCNumberValid struct {

Min int

Max int

}

type CCStringValid struct {

Min int

Max int

}

// 三個驗證器實現接口方法

func (c CCNumberValid) Validate(obj interface{}) (bool, error) {

v := obj.(int)

if v < c.Min || v > c.Max {

return false, fmt.Errorf(":int value should in range (%d, %d)", c.Min, c.Max)

}

return true, nil

}

func (c CCStringValid) Validate(obj interface{}) (bool, error) {

l := len(obj.(string))

if l < c.Min || l > c.Max {

return false, fmt.Errorf(":string length should in range (%d, %d)", c.Min, c.Max)

}

return true, nil

}

func (c CCDefaultValid) Validate(obj interface{}) (bool, error) {

return true, nil

}

var tagName = "cc"

// 公共方法,對外提供檢驗處理

func CCValidate(s interface{}) []error {

var errs []error

v := reflect.ValueOf(s)

for i := 0; i < v.NumField(); i++ {

tag := v.Type().Field(i).Tag.Get(tagName)

if tag == "" || tag == "-" {

continue

}

validator := parseValidatorFromTag(tag)

valid, err := validator.Validate(v.Field(i).Interface())

if !valid && err != nil {

errs = append(errs, fmt.Errorf("%s%s", v.Type().Field(i).Name, err.Error()))

}

}

return errs

}

// 從Tag字符串里分析出使用哪個驗證器,并賦值

func parseValidatorFromTag(tag string) CCValid {

args := strings.Split(tag, ",")

switch args[0] {

case "num":

v := CCNumberValid{}

fmt.Sscanf(strings.Join(args[1:], ","), "min=%d,max=%d", &v.Min, &v.Max)

return v

case "str":

v := CCStringValid{}

fmt.Sscanf(strings.Join(args[1:], ","), "min=%d,max=%d", &v.Min, &v.Max)

return v

}

return CCDefaultValid{}

}

0x03 在gin中的使用

我們開發校驗器的目的, 當然, 是為了能在gin中使用啦

直接上代碼, 理解起來不難:

type Result struct {

code int

msg string

data interface{}

}

func OK(msg string) Result {

return Result{0, msg, nil}

}

func NG(msg string) Result {

return Result{1, msg, nil}

}

// 解析JSON請求

r.POST("/login", func(c *gin.Context) {

var header MyHeader

var param Login

// 解析Header

if c.BindHeader(&header) != nil {

c.JSON(200, NG("invalid header"))

return

}

// 解析JSON

if c.BindJSON(&param) != nil {

c.JSON(200, NG("invalid json param"))

return

}

// 驗證

for _, firstErr := range CCValidate(param) {

c.JSON(200, NG(firstErr.Error()))

return

}

c.JSON(200, gin.H{"hello": param.Username, "world": param.Password, "from": header.From})

})

當驗證出錯時, 會向客戶端返回第一個發現的錯誤.

0x04 TODO

現在的代碼來看, 業務功能還沒開發呢, 已經寫了這么多行代碼了. 一點都不優雅.

接下來要考慮, 能不能利用中間件, 完成這些前置操作.

總結

以上是生活随笔為你收集整理的java 自定义validate_Golang-03 自定义validator,实现java注解功能-Go语言中文社区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久92 | 欧洲mv日韩mv国产 | 成人a毛片久久免费播放 | 福利片av | 亚洲免费视频一区二区三区 | 国产一区中文 | 国产视频久久久久久久 | 奇米影视999 | av免费天堂| 伊人www22综合色 | 婷婷九月| 精品人妻一区二区三区视频 | 香蕉av一区| 玖玖玖精品 | 李丽珍裸体午夜理伦片 | 国产精品秘入口18禁麻豆免会员 | 少妇高潮一69aⅹ | 国产乱码精品一区二三赶尸艳谈 | 亚洲一区二区三区视频在线 | 黑森林福利视频导航 | 一区二区在线视频 | 自拍偷拍三级 | 欧美高清hd19 | av制服丝袜| 性色av免费观看 | 欧美一区二区视频在线观看 | 久久一 | 久久青青热| 国产伦理片在线观看 | 色呦呦视频在线观看 | 国产精品毛片久久 | 成人日韩在线观看 | 三叶草欧洲码在线 | 日本中文字幕在线看 | 农民工hdxxxx性中国 | 亚洲视频在线观看一区二区三区 | 亚洲精品国产熟女久久久 | 成人av片在线观看 | 推特裸体gay猛交gay | 九九热这里有精品视频 | 日韩精品在线播放 | 好吊色视频一区二区 | 国产精品伦理 | 爱草av| 91精品国产自产91精品 | 中文字幕色哟哟 | 亚洲国产私拍精品国模在线观看 | 国产成人精品一区二区三 | 国产精品黑人一区二区三区 | 人人人插 | 岛国久久久 | 免费看的黄色录像 | 久久盗摄 | 午夜极品视频 | 日本中文在线 | 国产精品国产三级国产专区51区 | 天堂av免费在线 | 亚洲 小说区 图片区 | 成人午夜免费视频 | 国产极品网站 | 日本强好片久久久久久aaa | 超碰一区二区三区 | 日韩av网站在线播放 | 国产成人精品亚洲线观看 | 竹菊影视日韩一区二区 | 欧美视频一区二区三区四区 | 亚洲精品欧洲精品 | 午夜丁香婷婷 | 美女羞羞动态图 | 国模在线视频 | 久久美女av | 国产欧美一区二区三区视频 | 亚洲日本在线观看 | 九色免费视频 | 男女激情视频网站 | 国产成人在线免费视频 | 国产精品伦一区二区三区免费看 | 日韩av在线一区二区三区 | 亚洲精品日韩在线观看 | 久久精品www人人爽人人 | 午夜影院免费观看 | 日韩精品视频中文字幕 | 干美女少妇 | 精品视频在线一区 | 无码一区二区三区免费视频 | 高清不卡一区二区 | 成人h动漫精品一区 | 超级黄色录像 | aaaaaabbbbbb毛片 | 亚洲黄色成人 | 撸大师av | aaaaa级少妇高潮大片免费看 | 中文字幕亚洲日本 | 国产精品久久久久毛片软件 | 成年人国产视频 | 国产一区二区三区视频在线观看 | 在线观看黄色网页 | 久久久久亚洲AV成人网人人小说 | 日本美女一级片 |