Valgo,类型安全,表达能⼒强的go验证器

valgo 是一个为 Go 语言设计的类型安全、表达性强且可扩展的验证库。该库的特点包括:
github.com/cohesivestack/valgo

  • 类型安全:利用 Go 语言的泛型特性(从 Go 1.18 版本开始支持),确保验证逻辑的类型安全。
  • 表达性:验证规则通过函数链式调用来定义,而非传统的结构体标签,这提供了更灵活和自由的方式来决定数据在哪里及如何被验证。
  • 可扩展性:支持自定义验证器和局部化验证消息,使得库能够适应多种场景。
  • 灵活性:验证规则直接写在函数中,而非依赖于结构体标签,提高了代码的可读性和可维护性。
  • 局部化:支持验证消息的定制和本地化,便于多语言环境下的错误反馈。
  • JSON 输出:错误信息可以输出为 JSON 格式,便于集成到 RESTful API 中。

快速示例

以下是一个使用 valgo 进行基本验证的示例:

package main

import (
	"encoding/json"
	"fmt"
	"github.com/cohesivestack/valgo"
)

func main() {
	validation := valgo.Is(
		valgo.String("test", "name").Not().Blank().OfLengthBetween(8, 20),
		valgo.Number(18, "age").GreaterThan(20),
	)

	if !validation.Valid() {
		out, _ := json.MarshalIndent(validation.Error(), "", "  ")
		fmt.Println(string(out))
	}
}

在这个例子中,我们验证了两个条件:

  1. name(全名)必须是非空字符串且长度在8到20个字符之间。
  2. age(年龄)必须大于20。

输出结果(当验证不通过时)可能是这样的 JSON 错误信息:

{
  "age": [
    "Age must be greater than 20"
  ],
  "name": [
    "name must have a length between  8 and 20"
  ]
}

自定义验证器

valgo 还允许创建自定义验证器。例如,假设我们想验证一个自定义的 ID 结构体:

type ID struct {
	Phone string
	Email string
}

func IDValue(value ID, nameAndTitle ...string) *valgo.ValidatorID {
	return &valgo.ValidatorID{context: valgo.NewContext(value, nameAndTitle...)}
}

type ValidatorID struct {
	context *valgo.ValidatorContext
}

func (validator *ValidatorID) Context() *valgo.ValidatorContext {
	return validator.context
}

// 示例验证规则:至少提供 Phone 或 Email
func (validator *ValidatorID) HasContactInfo() *ValidatorID {
	validator.context.Add(
		func() bool {
			return validator.context.Value().(*ID).Phone != "" || validator.context.Value().(*ID).Email != ""
		},
		"At least one contact method (phone or email) must be provided.",
	)
	return validator
}

使用自定义验证器示例

id := ID{Phone: "1234567890"}
validation := valgo.Is(IDValue(id).HasContactInfo())

if !validation.Valid() {
	// 处理错误
}

这个例子展示了如何定义一个 ID 类型的验证器,并添加了一个规则来检查是否至少提供了一种联系方式(电话或电子邮件)。这体现了 valgo 库的高度可扩展性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/694926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UFS协议入门-分层结构

写在前面:本文参考UFS jedec3.1,本文思维导图如下 1. 分层概述 UFS协议分为3层,从上至下分别是:应用层(UAP),传输层(UTP),互联层(UIC),具体结构如下图所示。 2.1 应用层 在应用层(UAP)中,包括:UFS指令集(UCS),设备管理器(Device Manager),任务管理器(Task Manager…

线性代数|机器学习-P10最小二乘法的四种方案

文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候,就会用到 最小二乘法 .根据矩阵A的情况,有如下四种方法 在r n m 时,SVD奇异…

Java Web学习笔记30——打包部署

打包: 到资源管理器中再看下: 将这些文件压缩成一个zip文件,然后到nginx的html目录中执行unzip 解压即可。 部署: Nginx:Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代…

SprirngBoot+Vue房屋租赁系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 租客管理员 功能截图

搭建智慧互联网医院系统教学:源码解析与在线问诊APP开发

本篇文章,小编将以“源码解析与在线问诊APP开发”为切入点,详细介绍搭建智慧互联网医院系统的过程。 一、智慧互联网医院系统的架构设计 系统架构概述 -前端 -后端 -数据库 功能模块划分 -用户 -预约 -挂号 -问诊、 -病历 -管理 -药品 -配送…

数据:人工智能的基石 | Scale AI 创始人兼 CEO 亚历山大·王的创业故事与行业洞见

引言 在人工智能领域,数据被誉为“新石油”,其重要性不言而喻。随着GPT-4的问世,AI技术迎来了新的浪潮。众多年轻创业者纷纷投身这一领域,Scale AI的创始人兼CEO亚历山大王(Alexander Wang)就是其中的佼佼…

TCP协议与UDP协议区别

举个列子: 三次握手:为了解决网络信道不可靠的问题;防止客户端向服务端发送两次数据,客户端一直处于接收的状态。 四次挥手是一样的。当客户端提出关闭请求,服务端处于关闭等待状态,此时客户端可以发送数据…

西门子step7脉冲方波

西门子300/400PLC程序可以使用系统时钟脉冲来完成一些定时任务,节省自己写Timer定时器。 定时器字节位定义 默认定义的MB1,则M1.5是1秒定时脉冲方波。 案例 快闪,慢闪。 报警器一闪一闪用。 1分钟计时及1分钟一个脉冲 30分钟计时及30分…

多模态vlm综述:An Introduction to Vision-Language Modeling 论文解读

目录 1、基于对比学习的VLMs 1.1 CLIP 2、基于mask的VLMs 2.1 FLAVA 2.2 MaskVLM 2.3 关于VLM目标的信息理论视角 3、基于生成的VLM 3.1 学习文本生成器的例子: 3.2 多模态生成模型的示例: 3.3 使用生成的文本到图像模型进行下游视觉语言任务 4、 基于预训练主干网…

双列集合底层源码

tips: 竖着的箭头:重写 横着的箭头:继承

单元测试之CppTest测试框架

目录 1 背景2 设计3 实现4 使用4.1 主函数4.2 测试用例4.2.1 定义4.2.2 实现 4.3 运行 1 背景 前面文章CppTest实战演示中讲述如何使用CppTest库。其主函数如下: int main(int argc, char *argv[]) {Test::Suite mainSuite;Test::TextOutput output(Test::TextOut…

App UI 风格,引领时尚

App UI 风格,引领时尚

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月9日,星期日

每天一分钟,知晓天下事! 2024年6月9日 星期日 农历五月初四 1、 人社部:个人养老金开户人数已超6000万,其中31岁至40岁的中高收入人群是开户、缴费和购买产品的主力军。 2、 医保局刊文:研究显示集采仿制药替代原研药…

URL的编码解码(一),仅针对ASCII码字符

用十六进制对特定字符编码,利用百分号标识搜索字符串解码十六进制字符。 (笔记模板由python脚本于2024年06月09日 18:05:25创建,本篇笔记适合喜好探寻URL的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free…

内存管理--3.用幻灯片讲解C++手动内存管理

用幻灯片讲解C手动内存管理 1.栈内存的基本元素 2.栈内存的聚合对象 3.手动分配内存和释放内存 注意:手动分配内存,指的是在堆内存中。 除非实现自己的数据结构,否则永远不要手动分配内存! 即使这样,您也应该通过std::allocator…

如何在本地和远程删除 Git 分支

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,目前是武汉城市开发者社区主理人 擅长.net、C、python开发, 如果遇…

计算机组成原理之指令格式

1、指令的定义 零地址指令: 1、不需要操作数,如空操作、停机、关中断等指令。 2、堆栈计算机,两个操作数隐藏在栈顶和此栈顶,取两个操作数,并运算的结果后重新压回栈顶。 一地址指令: 二、三地址指令 四…

selenium-java自动化教程

文章目录 Selenium支持语言WebDriver 开始使用chromedriver模拟用户浏览访问模拟点击事件关闭弹窗,选中元素并点击 获取页面文本结语 Selenium Selenium是一个自动化测试工具,可以模拟用户操作web端浏览器的行为,包括点击、输入、选择等。也可…

高考后志愿填报信息采集系统制作指南

在高考的硝烟散去之后,每位学生都面临着一个重要的任务——志愿填报。老师们如何高效、准确地收集和整理这些信息,成为了一个棘手的问题。难道我们只能依赖传统的手工登记方式,忍受其繁琐和易错吗? 易查分是一个简单易用的在线工具…

数据结构--递归和数组

个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…