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

2024-06-05 11:28

本文主要是介绍Valgo,类型安全,表达能⼒强的go验证器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

快速示例

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

package mainimport ("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 stringEmail 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 库的高度可扩展性。

在这里插入图片描述

这篇关于Valgo,类型安全,表达能⼒强的go验证器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032917

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word