GoFrame实现顺序性校验示例详解

 更新时间:2022年06月30日 09:01:51   作者:王中阳Go  
这篇文章主要为大家介绍了GoFrame实现顺序性校验示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在上一篇文章中 GoFrame数据校验之校验结果 | Error接口对象 ,关于顺序与非顺序性校验没有做充分的介绍。

这篇文章填上之前留的坑,我们以map校验举例:

基本介绍

我们通过上一篇文章了解到:Error接口对象的方法,其顺序性只有使用顺序校验规则时有效,否则返回的结果是随机的。

即使我们使用FirstItemFirstString()等其他方法获取校验结果也是一样,返回的校验结果不固定。

无序的原因

因为校验的规则我们传递的是map类型,而golangmap类型并不具有有序性(底层数据结构是hashmap),因此校验的结果和规则一样是随机的,同一个校验结果的同一个校验方法多次获取结果值返回的可能也不一样了。

顺序校验

我们来举个栗子:

校验结果中如果不满足required那么返回对应的错误信息,否则才是后续的校验错误信息;

也就是说,返回的错误信息应当和我设定规则时的顺序一致。

代码示例如下:

package main

import (
	"fmt"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
)

func main() {
	var (
		ctx    = gctx.New()
		params = map[string]interface{}{
			"passport":  "",
			"password":  "wangzhongyang",
			"password2": "wangyang",
		}
		rules = []string{
			"passport@required|length:6,16#账号不能为空|账号长度应当在{min}到{max}之间",
			"password@required|length:6,16|same:password2#密码不能为空|密码长度应当在{min}到{max}之间|两次密码输入不相等",
			"password2@required|length:6,16#",
		}
	)  
	err := g.Validator().Rules(rules).Data(params).Run(ctx)  
	if err != nil {
		fmt.Println(err.Map())
		fmt.Println(err.FirstItem())
		fmt.Println(err.FirstError())
	}
}

执行后,终端输出:

map[length:账号长度应当在6到16之间 required:账号不能为空]
passport map[length:账号长度应当在6到16之间 required:账号不能为空]
账号不能为空

可以看到,上述的执行结果是满足顺序性的。

我们来总结一下:我们想要校验结果满足顺序性,只需要将rules参数的类型设置为[]string,按照一定的规则设定即可,并且msgs参数既可以定义到rules参数中,也可以分开传入(使用第三个参数)。

rules的这种满足顺序性校验结果返回的规则,我们称之为gvalid tag

下一篇文章为大家剖析gvalid tag的知识点。

总结

通过这篇文章,我们已经拿到了实现顺序性校验的金钥匙:只需要将rules参数的类型设置为[]string,按照一定的规则设定即可,并且msgs参数既可以定义到rules参数中,也可以分开传入。

以上就是GoFrame实现顺序性校验示例详解的详细内容,更多关于GoFrame顺序性校验的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Golang实现加权负载均衡算法的实现代码

    使用Golang实现加权负载均衡算法的实现代码

    这篇文章主要介绍了使用Golang实现加权负载均衡算法的实现代码,详细说明权重转发算法的实现,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 详解如何利用Golang泛型提高编码效率

    详解如何利用Golang泛型提高编码效率

    Golang的泛型已经出来有一段时间了,大家应该或多或少对它有所了解。虽然Golang的泛型在功能上确实比较简单,而且确实可能会增加代码的复杂度,过度使用可能还会降低代码可读性。本文就来介绍一下Golang泛型的相关知识吧
    2023-04-04
  • Go 的入口函数和包初始化的使用

    Go 的入口函数和包初始化的使用

    本文主要介绍了Go 的入口函数和包初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 解决golang读取http的body时遇到的坑

    解决golang读取http的body时遇到的坑

    这篇文章主要介绍了解决golang读取http的body时遇到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang构建HTTP服务的实现步骤

    golang构建HTTP服务的实现步骤

    其实很多框架都是在 最简单的http服务上做扩展的的,基本上都是遵循http协议,本文主要介绍了golang构建HTTP服务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • go的切片扩容机制详解

    go的切片扩容机制详解

    本文主要介绍了go的切片扩容机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go的gin参数校验中的validator库详解

    Go的gin参数校验中的validator库详解

    这篇文章主要介绍了Go的gin参数校验之validator库,使用 validator 以后,只需要在定义结构体时使用 binding 或 validate tag标识相关校验规则,就可以进行参数校验了,而不用自己单独去写常见的校验规则,需要的朋友可以参考下
    2023-08-08
  • Go语言实现登录验证代码案例

    Go语言实现登录验证代码案例

    这篇文章主要介绍了Go语言实现登录验证代码案例,代码和图文讲解的很清晰,有感兴趣的可以学习下
    2021-03-03
  • Gin+Gorm实现CRUD的实战

    Gin+Gorm实现CRUD的实战

    本文主要介绍了Gin+Gorm实现CRUD的实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 通过源码分析Golang cron的实现原理

    通过源码分析Golang cron的实现原理

    golang实现定时任务很简单,只须要简单几步代码即可以完成,最近在做了几个定时任务,想研究一下它内部是怎么实现的,所以将源码过了一遍,记录和分享在此。需要的朋友可以参考以下内容,希望对大家有帮助
    2022-10-10

最新评论