当前位置: 首页 > news >正文

go语言后端开发学习(三)——基于validator包实现接口校验

前言

在我们开发模块的时候,有一个问题是我们必须要去考虑的,它就是如何进行入参校验,在gin框架的博客中我就介绍过一些常见的参数校验,大家可以参考gin框架学习笔记(四) ——参数绑定与参数验证,而这个其实也不是能够完全应对我们在日常开发中的需要,而今天我们要介绍的就是如何基于validator这个第三方库来实现对接口入参的校验,话不多说,开始发车!

validator包的下载

go get github.com/go-playground/validator/v10

validator的使用

背景介绍

在讲解validator包的使用方式之前我们先来看一个应用场景:博主最近在写自己的博客网站,而博客网站中有一个问题,我们先来看一下表结构:

type User struct {gorm.ModelUsername string `gorm:"type:varchar(20)" json:"username"`Password string `gorm:"type:varchar(100)" json:"password"`Role     int    `gorm:"type:int;default:2" json:"role"`
}

在博客中我设置了两种角色管理员(role=1)普通用户(role=2),而这也造成了一个问题:我们在添加用户按照正常业务情况是不能直接在前台创建管理员,而这个就需要我们在后端进行参数校验了(备注:其实参数校验这件事前后端都是要做的,但是我们这里介绍主要是后端,就以后端视角来介绍了),而接下来我们以给这个用户模块做参数校验为例,来介绍一下我们如何来实现参数校验以及一些其他的相关操作。

为数据模型添加校验条件

type User struct {gorm.ModelUsername string `gorm:"type:varchar(20)" json:"username" validate:"required,min=4,max=12"`Password string `gorm:"type:varchar(100)" json:"password" validate:"required,min=6 max=20"`Role     int    `gorm:"type:int;default:2" json:"role" validate:"required,gte=2"`
}

如上我们利用validate字段指明了数据的验证规则

拓展bindingvalidate的区别:

"validate"通常用于描述数据的验证规则,用于确保输入的数据符合特定的格式、要求或约束。验证通常在
数据提交之前进行,以确保数据的完整性和准确性。而"binding"通常用于描述数据的绑定规则,用于将用户界面元素与数据模型进行关联。数据绑定确保用户输
入的数据与数据模型的字段正确地同步,使用户界面的更改能够反映在数据模型中,或反之亦然。因此,
"validate"主要关注数据的验证和校验,而"binding"主要关注数据在用户界面元素和数据模型之间的绑定
和同步。

编写数据校验模块

我先示范一下数据消炎模块的书写,然后我再给大家具体讲解一下代码,首先我们来看一下最终我们所定义的User数据模型:

type User struct {gorm.ModelUsername string `gorm:"type:varchar(20)" json:"username" validate:"required,min=4,max=12" label:"用户名"`Password string `gorm:"type:varchar(100)" json:"password" validate:"required,min=6,max=20" label:"密码"`Role     int    `gorm:"type:int;default:2" json:"role" validate:"required,gte=2" label:"角色码"`
}

这里主要添加了两个标签:

  • validate:用来记录我们做入参验证的时候所做的限制条件
  • label:作为标记来返回标签值作为字段的名称

我们再来看校验模块的源代码:

package validatorimport ("fmt""gin_vue_blog/utils/errmsg""github.com/go-playground/locales/zh_Hans_CN"ut "github.com/go-playground/universal-translator""github.com/go-playground/validator/v10""github.com/go-playground/validator/v10/translations/zh""reflect"
)func Validator(data any) (string, int) {validate := validator.New()uni := ut.New(zh_Hans_CN.New())trans, _ := uni.GetTranslator("zh_Hans_CN")err := zh.RegisterDefaultTranslations(validate, trans) // 注册翻译器if err != nil {fmt.Println("err:", err)}validate.RegisterTagNameFunc(func(field reflect.StructField) string {label := field.Tag.Get("label") // 获取label标签return label})err = validate.Struct(data)if err != nil {for _, err := range err.(validator.ValidationErrors) {return err.Translate(trans), errmsg.ERROR}}return "", errmsg.SUCCESS
}

我们可以来测试一下这段代码,效果如下:
在这里插入图片描述
我们可以看到我们成功实现了数据的校验功能,我们来看一下这一整个过程:

  1. 初始化valitor
	validate := validator.New()
  1. 编写中间件,实现国际化
    validator中其默认的错误信息是英文,一定程度上会影响我们阅读,我们可以尝试将其转换为其他语言,这里我选择转换为简体中文:
uni := ut.New(zh_Hans_CN.New())trans, _ := uni.GetTranslator("zh_Hans_CN")err := zh.RegisterDefaultTranslations(validate, trans) // 注册翻译器if err != nil {fmt.Println("err:", err)}
  1. 进行数据校验并返回错误消息
    err = validate.Struct(data)
    if err != nil {for _, err := range err.(validator.ValidationErrors) {return err.Translate(trans), errmsg.ERROR}
    }
    return "", errmsg.SUCCESS
    }
    

就这样我们就实现了一个通用的数据校验模块了。

相关文章:

go语言后端开发学习(三)——基于validator包实现接口校验

前言 在我们开发模块的时候,有一个问题是我们必须要去考虑的,它就是如何进行入参校验,在gin框架的博客中我就介绍过一些常见的参数校验,大家可以参考gin框架学习笔记(四) ——参数绑定与参数验证,而这个其实也不是能够完全应对我…...

系统架构设计师【补充知识】: 应用数学 (核心总结)

一、 图论之最小生成树 (1)定义: 在连通的带权图的所有生成树中,权值和最小的那棵生成树(包含图中所有顶点的树),称作最小生成树。 (2)针对问题: 带权图的最短路径问题。 (3)最小生成树的解法有普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法,我…...

【ArcGIS微课1000例】0118:一文讲清楚tif(geotiff)栅格数据格式

文章目录 一、Tiff概述二、GeoTiff概述1. ovr文件2. tfw文件3. xml文件4. dbf文件一、Tiff概述 TIFF(Tagged Image File Format)是一种常见的图像文件格式,它被广泛用于存储和传输各种类型的图像数据。下面是对TIFF格式数据的介绍: 图像存储:TIFF格式可以存储多通道的位…...

调用第三方API --------------Python篇

在项目开发过程中,可能需要调用第三方的一些API或者公司提供的数据接口来得到相应的数据或者实现对应的功能。 因此API的调用和数据接口的访问都是做数据分析的一个常用操作,如何快速实现API和数据接口的调用,网上一般提供很多语言版本&#…...

Web自动化测试-掌握selenium工具用法,使用WebDriver测试Chrome/FireFox网页(Java

目录 一、在Eclipse中构建Maven项目 1.全局配置Maven 2.配置JDK路径 3.创建Maven项目 4.引入selenium-java依赖 二、Chrome自动化脚本编写 1.创建一个ChromeTest类 2.测试ChromeDriver 3.下载chromedriver驱动 4.在脚本中通过System.setProperty方法指定chromedriver的…...

maven多模块项目搭建

文章目录 创建方式创建父项目创建子模块 目录结构示例父模块模块A模块B(并在模块B中引入模块A) 注意事项 创建方式 创建父项目 #创建文件夹后,进入目录,执行以下命令 PS D:\demo> mvn archetype:generate #将输出很多模板&am…...

PostgreSQL的视图pg_tables

PostgreSQL的视图pg_tables pg_tables 是 PostgreSQL 中的一个系统视图,用于显示当前数据库中所有用户定义的表的信息。这个视图提供了关于表的名称、所属模式(schema)、所有者以及表类型等详细信息。 pg_tables 视图的主要列 列名类型描述…...

Stable diffusion采样器详解

在我们使用SD web UI的过程中,有很多采样器可以选择,那么什么是采样器?它们是如何工作的?它们之间有什么区别?你应该使用哪一个?这篇文章将会给你想要的答案。 什么是采样? Stable Diffusion模…...

为什么要进行渗透测试?

渗透测试的重要性 渗透测试是一种安全评估技术,旨在模拟黑客攻击,发现和利用系统漏洞,以评估企业信息系统的安全性。以下是进行渗透测试的几个主要原因: 1.发现潜在的漏洞和安全风险:渗透测试可以模拟真实的攻击行为…...

后方碰撞预警系统技术规范(简化版)

后方碰撞预警系统技术规范(简化版) 1 系统概述2 预警区域3 预警目标4 功能需求功能条件5 显示需求6 指标需求1 系统概述 后方碰撞预警系统RCW(Rear Collision Warning)是在后方车辆即将与自车发生碰撞之前,激活危险警告灯以较高频率闪烁,从而吸引后方驾驶员的注意力,避免…...

Position定位

Position定位 CSS中position属性是比较常用的元素定位方案,position常用的取值有static、relative、absolute、fixed、sticky、inherit。 static static属性是HTML元素的默认值,即没有定位,遵循正常的文档流对象,对于top、bott…...

npm install 的原理

1. 执行命令发生了什么 ? 执行命令后,会将安装相关的依赖,依赖会存放在根目录的node_modules下,默认采用扁平化的方式安装,排序规则为:bin文件夹为第一个,然后是开头系列的文件夹,后…...

基于I2C协议的OLED显示(利用U82G库)

目录 一、I2C协议 1、了解I2C协议的基本原理和时序协议 基本原理 时序协议 2、掌握0.96寸OLED屏的工作原理,汉字点阵显示原理 OLED 工作原理 汉字点阵显示原理 3、掌握开源GUI库U82G在stm32上的移植编译方法,以及图形界面可视化技术。 二、具体…...

【文末附gpt升级秘笈】探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章

探索AGI之路:穿越大模型的冰与火,谱写未来技术的乐章 摘要 随着人工智能技术的飞速发展,大模型成为了业界关注的焦点。然而,大模型并非万能,其背后隐藏着诸多迷思与挑战。本文基于“AGI技术50人”访谈栏目的素材&…...

国内12寸先进封装厂家的一些情况

一、12寸先进封装厂家 在中国大陆,专注于12英寸(300mm)晶圆的先进封装技术的企业包括但不限于以下几家: 1. 长电科技(JCET Technologies Co., Ltd.):长电科技是中国领先的半导体封装测试企业之…...

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279 需强化知识点 python 的幂次计算, 10 ** 5, 10 **(0.5) 题目 卡码 57. 爬楼梯(第八期模拟笔试) 注…...

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架,因此C的语法和数据类型在Qt中都是被支持的,但是Qt中也是定义了一些属于自己的数据类型,不过,好多数据类型都是对C的数据类型进行封装,下面来简要介绍一下这些基…...

【源码】Spring Data JPA原理解析之事务执行原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...

第十一篇——信息增量:信息压缩中的保守主义原则

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 通过信息中的保守主义,我想到了现实中人的保守主义一样&#…...

中国飞行器设计创新大赛多旋翼无人机任务飞行

源码&#xff1a;后续补充 1、启动launch文件 roslaunch robot_bringup mission.launch <launch> <!--启动mavros节点 --><include file"$(find mavros)/launch/px4.launch" /><!--启动USB摄像头节点 --><include file"$(find…...

基于Python/Flask的洗车店业务管理系统设计与实现

1. 项目概述&#xff1a;从“洗车”到“洗车服务”的数字化重构最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“washing-cars”。光看名字&#xff0c;你可能会觉得这只是一个关于洗车的小工具或者记录表。但当我深入进去&#xff0c;才发现它远不止于此。这个项目本质上…...

韩国市场合规语音交付迫在眉睫!ElevenLabs韩文生成必须配置的4项GDPR+KCC隐私开关

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;韩国市场语音AI合规落地的紧迫性与战略意义 韩国《个人信息保护法》&#xff08;PIPA&#xff09;于2023年修订后&#xff0c;明确将语音生物特征数据列为“敏感信息”&#xff0c;要求语音AI系统在采集…...

Cesium动态泛光效果实战:手把手教你用d3kit插件打造炫酷城市光效(附完整代码)

Cesium动态泛光效果实战&#xff1a;手把手教你用d3kit插件打造炫酷城市光效&#xff08;附完整代码&#xff09; 当夜幕降临&#xff0c;城市天际线被霓虹灯勾勒出流动的轮廓&#xff0c;这种视觉冲击力正是现代三维可视化项目的灵魂所在。本文将带你用d3kit这个轻量级插件&am…...

Cortex-A78C架构解析:AMU与ETM寄存器实战指南

1. Cortex-A78C核心架构与寄存器概览Cortex-A78C是Armv8-A架构的高性能实现&#xff0c;面向移动计算和边缘AI场景优化。作为A78系列的安全增强版本&#xff0c;它在保留原有3发射乱序执行流水线的基础上&#xff0c;新增了Pointer Authentication等安全扩展&#xff0c;同时强…...

基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

MEMS传感器机械臂姿态检测【附代码】

✨ 长期致力于MEMS传感器、机械臂、惯性测量单元、数据融合、姿态检测系统研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;设计基于ICM20948的惯性测量…...

基于CircuitPython与ESP32-S3的智能LED矩阵闹钟项目全解析

1. 项目概述与核心思路几年前&#xff0c;当我第一次接触ESP32和MicroPython时&#xff0c;就被其“用Python玩硬件”的理念深深吸引。但说实话&#xff0c;早期的MicroPython在库支持和开发体验上&#xff0c;对新手并不算太友好。直到Adafruit推出了CircuitPython&#xff0c…...

FPGA开发入门:从零开始用Vivado实现LED流水灯项目

1. 项目概述与核心价值最近在后台和社群里&#xff0c;看到不少刚接触FPGA开发的朋友&#xff0c;特别是从单片机或嵌入式软件转过来的&#xff0c;对于如何上手第一个完整的FPGA项目感到有些迷茫。大家常问&#xff1a;“我学了Verilog语法&#xff0c;也跑过仿真了&#xff0…...

从逻辑门到加法器:Verilog实现半加器与全加器的三种抽象层级

1. 项目概述&#xff1a;从逻辑门到加法器的数字世界基石在数字电路和芯片设计的入门路上&#xff0c;加法器是一个绕不开的经典课题。它不仅是算术逻辑单元&#xff08;ALU&#xff09;的核心组件&#xff0c;更是理解数字系统如何执行基本运算的关键。今天&#xff0c;我们不…...

智能硬件开发实战:从核心架构到产品落地的全流程解析

1. 智能硬件&#xff1a;从概念到现实的产业全景透视提起“智能硬件”&#xff0c;很多朋友可能觉得这是个离自己生活有点距离的高科技词汇。但如果说“智能手机”&#xff0c;那几乎无人不知&#xff0c;无人不晓。其实&#xff0c;智能硬件和智能手机在本质上是一脉相承的&am…...