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顺序性校验的资料请关注我们其它相关文章!

(0)

相关推荐

  • GoFrame框架数据校验之校验结果Error接口对象

    目录 基本介绍 方法示例 注意问题 方法详解 进阶 注意问题 总结 上一篇文章介绍了 GoFrame数据校验之校验对象 | 校验结构体 ,得到了大家积极的反馈. 再接再厉,这篇总结分享:GoFrame数据校验之校验结果总结分享. 基本介绍 校验结果为一个Error接口对象.当数据规则校验成功时,校验方法返回的结果为nil. 当数据规则校验失败时,返回的该对象是包含结构化的层级map,包含多个字段及其规则及对应错误信息,以便于接收端能够准确定位错误规则. 方法示例 首先我们看一下Error的数据结

  • GoFrame gcache 缓存控制 淘汰策略

    目录 打印结果 缓存控制 打印结果 场景分析 代码示例 打印结果 GetOrSetFunc的使用 基本概念 gcache模块默认提供的是一个高速的内存缓存,操作效率非常高效,CPU性能损耗在ns纳秒级别.使用简单易上手,非常适合单机应用使用. 基本使用 我们可以通过gcache.New()创建一个缓存对象 也可以直接使用gcache包方法,使用方式都是一样的. 下面代码段介绍了gcache的基本使用: package main import ( "fmt" "github.c

  • GoFrame gredis配置文件及配置方法对比

    目录 前言摘要 GoFrame gredis 配置文件(推荐) 使用示例: 打印结果 配置方法(高级) 使用示例: 总结 前言摘要 上一篇文章为大家介绍了 GoFrame gcache使用实践 | 缓存控制 淘汰策略 ,得到了大家积极的反馈. 后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf. GoFrame gredis goframe框架支持两种方式来管理redis配置和获取redis对象,一种是通过配置

  • GoFrame框架数据校验之校验对象校验结构体

    目录 前言摘要 基本概念 方法介绍 简要说明 注意问题TIPS 链式操作 示例1:单数据校验 简单示例 进阶示例 进阶示例打印结果 示例2:Map数据校验 示例3:Struct数据校验 总结 前言摘要 这篇文章将会为大家介绍GoFrame数据校验中校验对象的知识点,包括:Validator对象常用方法的介绍.单数据校验.校验Map.校验结构体的示例. 基本概念 数据校验组件提供了数据校验对象:用于数据校验统一的配置管理,支持我们便捷的进行链式操作. 方法介绍 type Validator fun

  • GoFrame错误处理常用方法及错误码使用示例

    目录 前言 错误创建 New/Newf Wrap/Wrapf NewSkip/NewSkipf 错误码使用 错误码相关方法概览 NewCode/NewCodef 示例代码 WrapCode/WrapCodef 示例代码 NewCodeSkip/NewCodeSkipf 获取error中的错误码接口 总结 前言 这篇文章将为大家介绍:GoFrame 错误处理的常用方法&错误码的使用.如何自定义错误对象.如何忽略部分堆栈信息.如何自定义错误码的返回.如何获取error对象中的错误码. 错误创建 Ne

  • GoFrame gredis缓存DoVar Conn连接对象 自动序列化

    目录 整体介绍 小技巧 基本使用 HSET/HGETALL操作 HMSET/HMGET操作 基本使用 Send批量指令 订阅/发布 map存取 打印结果 struct存取 打印结果 上一篇文章为大家介绍了 GoFrame gcache使用实践 | 缓存控制 淘汰策略 ,得到了大家积极的反馈. 后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf. 这篇文章比较硬核,爆肝2千字,阅读大约需要5~8分钟. 详细的介绍

  • GoFrame 框架缓存查询结果的示例详解

    目录 查询缓存 相关方法: 缓存对象 缓存适配(Redis缓存) 使用示例 数据表结构 示例代码 小技巧 运行结果分析 总结 后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf. 今天重点为大家介绍:GoFrame 如何优雅的缓存查询结果 查询缓存 gdb支持对查询结果的缓存处理,常用于多读少写的查询缓存场景,并支持手动的缓存清理. 需要注意的是,查询缓存仅支持链式操作,且在事务操作下不可用. 相关方法: fu

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

    目录 引言 基本介绍 无序的原因 顺序校验 总结 引言 在上一篇文章中 GoFrame数据校验之校验结果 | Error接口对象 ,关于顺序与非顺序性校验没有做充分的介绍. 这篇文章填上之前留的坑,我们以map校验举例: 基本介绍 我们通过上一篇文章了解到:Error接口对象的方法,其顺序性只有使用顺序校验规则时有效,否则返回的结果是随机的. 即使我们使用FirstItem, FirstString()等其他方法获取校验结果也是一样,返回的校验结果不固定. 无序的原因 因为校验的规则我们传递的是

  • Struts2学习教程之输入校验示例详解

    前言 数据校验几乎是每个应用都要做的工作.用户输入的数据,发送到服务器端,天知道用户输入的数据是否是合法的,是否为恶意输入.所以一个健壮的应用系统必须对用户的输入进行校验,将非法的输入阻止在应用之外,防止这些非法的输入进入系统,从而保证系统的稳定性.安全性. 我们都知道,为了更好的用户体验,以及更高的效率,现在的Web应用都存在以下两重数据校验: 客户端数据校验 服务器端数据校验 对于客户端数据校验主要是通过JavaScript代码来完成:而对于服务器端数据校验是整个应用阻止非法数据的最后防线,

  • 如何在spring boot中进行参数校验示例详解

    上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中如何进行参数校验. lombok使用介绍 在介绍参数校验之前,先来了解一下lombok的使用,因为在接下来的实例中或有不少的对象创建,但是又不想写那么多的getter和setter,所以先介绍一下这个很强大的工具的使用. Lombok 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • iOS小技能之字典转模及对象相等性示例详解

    目录 前言 I 字典转模型 1.1 字典转模型的实现步骤 1.2 字典转模型的过程 II 对象的相等性 & 本体性 2.1 相等性检查 2.2 Foundation 框架中,自己实现的相等性检查 2.3 字符串驻留 III 代码重构(前提是已经实现了基本功能) see also 前言 字典转模型 /** 通常实现字典实例化模型,都实现了以下模型的实例化方法*/ //使用字典实例化模型 - (instancetype) initWithDictionary :(NSDictionary *) ap

  • C语言实现顺序表的基本操作的示例详解

    目录 一.认识顺序表 1.线性表 2.顺序表的概念及结构 二.顺序表的基本操作(接口实现) 1.初始化顺序表 2.打印顺序表 3.尾插 4.尾删 5.扩容 6.头插 7.头删 8.任意位置插入 9.任意位置删除 10.查找某个数的位置 三.顺序表演示及代码(含源码) 1.演示效果 2.完整源代码 一.认识顺序表 1.线性表 线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表有顺序表.链表.栈.队列.字符串……线性表在逻辑上是线性结构,也就是说是一条

  • 语言编程花絮内建构建顺序示例详解

    目录 1 构建 顺序 1.1 交叉编译 1.2 设置 2 构建测试支持 1 构建 顺序 依据词法名顺序 当导入一个包,且这个包 定义了 init(), 那么导入时init()将被执行. 具体执行顺序: 全局变量定义时的函数 import 执行导入 -> cont 执行常量 --> var 执行变量 --> 执行初始化 init() --> 执行 main() ----> main import pk1 ---> pk1 const ... import pk2 ---&

  • 常用JavaScript正则表达式汇编与示例详解

    1.1 前言 目前收集整理了21个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IP地址. 十六进制颜色. 日期. 微信号.车牌号.中文正则等.表单验证处理必备,赶紧收藏吧! 还会陆续加入新的正则进来,大家多提宝贵意见! 2.1 用户名正则 2.1.1 基本用户名正则 在做用户注册时,都会用到用户名正则校验. 定义基本用户名命名规则如下: 最短4位,最长16位 {4,16} 可以包含小写大母 [a-z]

  • SpringBoot服务端数据校验过程详解

    这篇文章主要介绍了SpringBoot服务端数据校验过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的,而数据验证又是一个企业级项目架构上最为基础的功能模块,这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证.为什么这么说呢?往往我们在编写程序的时候都会感觉后台的验证无关紧要,毕竟客户端已经做过验证了,后端没必要在浪费资源对数据进行验证了,但恰恰是这种思维最为容易

  • Java设计模式之建造者模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 建造者模式的优势: 注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象.建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可 以构建它们,用户不需要知道内部的具体构建细节. 案例 需求 女生每天化妆,假如只需要做发型,香水,衣服,并要求按照发型——>香水——>衣服的顺序进行,

随机推荐