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

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还