ok go

更新时间:2023-01-03 22:16:08 阅读: 评论:0


2023年1月3日发(作者:网上教育平台)

beegovalidation

相信接触过后端开发的都使⽤过表单设计⼯具,这⾥就分析⼀下beego表单验证⼯具validation是如何⼯作的

import(

"/astaxie/beego/validation"

"log"

)

typeUrstruct{

Namestring

Ageint

}

funcmain(){

u:=Ur{"man",40}

valid:=tion{}

ed(,"name")

e(,15,"nameMax")

(,0,140,"age")

ors(){

//validationdoesnotpass

//printinvalidmessage

for_,err:={

n(,e)

}

}

//orulikethis

ifv:=(,140,"ageMax");!{

n(,e)

}

}

moreinfo:/docs/mvc/controller/

这是官⽅给的⼀段⽰例代码

可以看到⾸先这⾥初始化了⼀个valid结构体

并调⽤了其下的相应的⽅法,这⾥就以最简单的Required为例讲⼀讲valid是如何验证数据的

//RequiredTestthattheargumentisnon-nilandnon-empty(ifstringorlist)

func(v*Validation)Required(objinterface{},keystring)*Result{

(Required{key},obj)

}

这是源码⾥的valid⽅法,可以看到它属于Validation对象,并且调⽤了validation的apply⽅法.

typeValidationstruct{

//ifthisfieldttrue,instructtagvalid

//ifthestructfieldvaleimpty

//itwillskipthovalidfunctions,eCanSkipFuncs

RequiredFirstbool

Errors[]*Error

ErrorsMapmap[string][]*Error

}

//接⼝

//Validatorinterface

typeValidatorinterface{

IsSatisfied(interface{})bool

DefaultMessage()string

GetKey()string

GetLimitValue()interface{}

}

//结构体对象

//Requiredstruct

typeRequiredstruct{

Keystring

}

//这⾥传⼊了⼀个Validator的对象,但上⽂调⽤的时传⼊的时Required对象,

//说明有⼀个⼀定是接⼝,并且另⼀个实现了这个接⼝,我把他们放在上⾯

func(v*Validation)apply(chkValidator,objinterface{})*Result{

ifnil==obj{

sfied(obj){

return&Result{Ok:true}

}

}(obj).Kind()=={

f(obj).IsNil(){

sfied(nil){

return&Result{Ok:true}

}

}el{

sfied(f(obj).Elem().Interface()){

return&Result{Ok:true}

}

}

}sfied(obj){

return&Result{Ok:true}

}

//下⾯是返回错误信息的了

//可以看到主要的⼯作⽅法是Validator下的IsSatisfied⽅法

--------------------------------------------------------------------------------------

/*

·········

*/

//Alsoreturnitintheresult.

return&Result{

Ok:fal,

Error:err,

}

}

func(rRequired)IsSatisfied(objinterface{})bool{

ifobj==nil{

returnfal

}

ifstr,ok:=obj.(string);ok{

returnlen(ace(str))>0

}

if_,ok:=obj.(bool);ok{

returntrue

}

ifi,ok:=obj.(int);ok{

returni!=0

}

ifi,ok:=obj.(uint);ok{

returni!=0

}

ifi,ok:=obj.(int8);ok{

returni!=0

}

ifi,ok:=obj.(uint8);ok{

returni!=0

/*

······省略

*/

v:=f(obj)

()=={

()>0

}

returntrue

}

可以看到这⾥先使⽤类型断⾔判断传⼊的空接⼝类型,再判断其值是否设置了。

其他诸如

//MinTestthattheobjisgreaterthanminifobj'stypeisint

func(v*Validation)Min(objinterface{},minint,keystring)*Result{

(Min{min,key},obj)

}

//MaxTestthattheobjislessthanmaxifobj'stypeisint

func(v*Validation)Max(objinterface{},maxint,keystring)*Result{

(Max{max,key},obj)

}

//RangeTestthattheobjisbetweenmniandmaxifobj'stypeisint

func(v*Validation)Range(objinterface{},min,maxint,keystring)*Result{

(Range{Min{Min:min},Max{Max:max},key},obj)

}

Min,Max,Rang等也是如此

⽽类似IP,Email,Phone则是使⽤相应的正则匹配但是执⾏流程也是这样。

func(mMin)IsSatisfied(objinterface{})bool{

varvint

switchobj.(type){

caint64:

ifwordsize==32{

returnfal

}

v=int(obj.(int64))

caint:

v=obj.(int)

caint32:

v=int(obj.(int32))

caint16:

v=int(obj.(int16))

caint8:

v=int(obj.(int8))

default:

returnfal

}

returnv>=

}

但是结构体⽐较特殊,是单独写的验证函数,有兴趣可以⾃⼰去看看

本文发布于:2023-01-03 22:16:08,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/86862.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:未来闪影
下一篇:中学语文作文
标签:ok go
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图