golang中通过反射获取结构体Tag标签定义的内容 函数和测试用例

当我们在go语言中定义结构体的时候, 经常需要给某些字段打上一个Tag标签,  如 Name string `json:"name"·` , 那这个标签有和作用呢?  这个作用可大了,最为常用的是json序列化和反序列化, 还有各种ORM 的实体对象定义,这个Tag可是必不可少的。 今天给大家介绍的这个函数就是用来获取这个Tag中定义的值的函数, 废话不多说,直接上代码:

获取结构体Struct标签Tag的值函数GetStructTagVal

import ("fmt""reflect"
)// 获取一个结构体TAG中的指定tagKey的值, 如果没有对应的tagKey则返回空字符串和相应的错误信息
// structObj 结构体对象
// fieldName 结构体中定义的字段名称 区分大小写
// tagkey 结构体字段的Tag中定义的key,
//
//	    如: 结构体字段定义 Name string `json:"name" orm:"varchar(50) comment('名称')"`
//		这里的tagKey就是 json 或者 orm
//		获取到的值就是tagKey后面的双引号内的值,如tagkey为 orm 获取的值就是 varchar(50) comment('名称')
//
// @author tekintian <tekintian@gmail.com>
func GetStructTagVal(structObj interface{}, fieldName, tagKey string) (string, error) {refType := reflect.TypeOf(structObj)if refType.Kind() != reflect.Struct { //传入的数据非结构体类型,直接返回return "", fmt.Errorf("传入参数 %v 的类型为 %T , 非结构体类型!", structObj, structObj)}if fieldObj, ok := refType.FieldByName(fieldName); ok {// 这里的sfield.Tag.Get(tagKey) 直接返回的是一个字符串if tagVal, isOk := fieldObj.Tag.Lookup(tagKey); isOk {return tagVal, nil} else {return "", fmt.Errorf("在结构体 %v 字段 %v 中未找到tagkey为 %v 的定义", refType.Name(), fieldName, tagKey)}}return "", fmt.Errorf("在结构体 %v 中未找到 %v 字段的定义", refType.Name(), fieldName)
}// 根据结构体StructField获取tag标签的值 没有对应的tagkey将返回空字符串
//   - field: 通过反射获取的字段对应的结构体字段对象 reflect.TypeOf(structObj).FieldByName(fieldName)
//   - tagKey: tag标签的key
func GetStructTagValByStructField(fieldObj reflect.StructField, tagKey string) string {return fieldObj.Tag.Get(tagKey)
}

GetStructTagVal函数测试用例:

import ("testing"
)// GetStructTagVal单元测试用例
// @author tekintian <tekintian@gmail.com>
func TestGetStructTagVal(t *testing.T) {// 定义测试用例数据cases := []struct { // 测试用例输入参数和期望输出参数定义structObj anyfieldName stringtagkey    stringexpected  string // 预期结果}{{structObj: Person{}, fieldName: "Name", tagkey: "myorm", expected: "varchar(25) notnull unique 'usr_name' comment('姓名')"},{structObj: Person{}, fieldName: "age", tagkey: "json", expected: "age"},// 异常测试用例数据定义{structObj: Person{}, fieldName: "sex", tagkey: "json", expected: "在结构体 Person 中未找到 sex 字段的定义"},{structObj: Person{}, fieldName: "age", tagkey: "json1", expected: "在结构体 Person 字段 age 中未找到tagkey为 json1 的定义"},{structObj: 123, fieldName: "x", tagkey: "y", expected: "传入参数 123 的类型为 int , 非结构体类型!"}, // 这个直接就返回异常了}for _, v := range cases {t.Run(v.fieldName, func(t *testing.T) {tagVal, err := GetStructTagVal(v.structObj, v.fieldName, v.tagkey)// 这里如果异常信息不为空,且异常信息 等于期望的异常 或者 输出结果等于期望结果 测试成功if (err != nil && err.Error() == v.expected) || tagVal == v.expected {t.Log(tagVal) // 测试通过,打印日志信息} else {// 测试失败的情况// 有异常且是非期望的异常if err != nil {t.Fatal(err) // 测试失败,打印异常信息} else {// 结果不等于预期 测试失败t.Fatalf("test failed, expected '%v', got '%v'", v.expected, tagVal)}}})}
}

参考 reflect package - reflect - Go Packages

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# yolov8 TensorRT +ByteTrack Demo

C# yolov8 TensorRT ByteTrack Demo 目录 效果 说明 项目 代码 Form2.cs YoloV8.cs ByteTracker.cs 下载 参考 效果 说明 环境 NVIDIA GeForce RTX 4060 Laptop GPU cuda12.1cudnn 8.8.1TensorRT-8.6.1.6 版本和我不一致的需要重新编译TensorRtExtern.dll&…

微调医疗大模型,与通用大模型效果对比

下面是一份CT描述&#xff1a; “肝脏大小、形态未见明确异常。肝S2见一结节状低密度影&#xff0c;大小约13x11mm&#xff0c;增强扫描呈明显渐进性强化&#xff0c;延迟期呈等密度。余肝实质内未见异常密度影或强化灶。肝内大血管及其分支走行未见异常&#xff0c;肝门区层次…

ip地址告诉别人安全吗?ip地址告诉别人会有什么风险

IP地址告诉别人安全吗&#xff1f;在数字化时代&#xff0c;IP地址作为网络连接的关键标识符&#xff0c;承载着重要的安全意义。然而&#xff0c;很多人可能并不清楚&#xff0c;轻易地将自己的IP地址告诉他人可能带来一系列安全风险。那么&#xff0c;IP地址告诉别人会有什么…

文件夹损坏0字节:全面解析、恢复技巧与预防策略

在数字时代&#xff0c;数据的完整性和安全性至关重要。然而&#xff0c;我们时常会遭遇文件夹损坏并显示为0字节的棘手问题。这种情况一旦发生&#xff0c;用户可能会面临数据丢失的风险。本文将详细探讨文件夹损坏0字节的现象&#xff0c;分析其背后的原因&#xff0c;并提供…

Redis-重定向

实验环境&#xff08;3主3从的Redis-Cluster&#xff09; 一、Redis重定向基础篇 1、MOVED重定向 Redis Custer 中&#xff0c;客户端可以向集群中任意节点发送请求。此时当前节点先对 Key 进行 CRC 16 计算&#xff0c;然后按 16384 取模确定 Slot 槽。确定该 Slot 槽所对应的…

为什么使用短链系统?

短链接&#xff08;Short Link&#xff09;是指将一个原始的长 URL&#xff08;Uniform Resource Locator&#xff09;通过特定的算法或服务转化为一个更短、易于记忆的 URL。短链接通常只包含几个字符&#xff0c;而原始的长 URL 可能会非常长。 短链接的原理非常简单&#x…

FPGA编程与PLC编程的区别:深入解析与对比

FPGA编程与PLC编程的区别&#xff1a;深入解析与对比 在工业自动化和控制系统领域&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;编程和PLC&#xff08;可编程逻辑控制器&#xff09;编程都是关键的编程技术&#xff0c;但它们在应用、功能、结构和编程方法上存在…

IEEE编程语言排行榜:深度解析编程语言的四大维度、五大趋势、六大热门与七大挑战

IEEE编程语言排行榜&#xff1a;深度解析编程语言的四大维度、五大趋势、六大热门与七大挑战 在信息技术领域&#xff0c;编程语言排行榜一直是衡量各种编程语言流行度和影响力的重要指标。IEEE&#xff08;电气电子工程师协会&#xff09;作为全球最具影响力的科技专业组织之…

【Java数据结构】详解LinkedList与链表(二)

目录 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.反转一个单链表 3. 找到链表的中间节点 4.输入一个链表&#xff0c;输出该链表中倒数第k个结点。 5.合并两个有序链表 6.链表分割 7. 判定链表的回文结构 8.输入两个链表&#xff0c;找…

栈与队列练习题(2024/5/31)

1有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

云服务和云备份的区别是什么?

随着云计算的兴起&#xff0c;云备份与云服务被越来越多的企业和个人所关注&#xff0c;在云计算中云服务与云备份之间还是有一定的区别的&#xff0c;本文就来介绍一下云服务和云备份之间的区别。 云服务和云备份主要的区别在备份对象、推荐场景和数据一致性等方面。 备份对象…

打印机的ip不同且连不上

打印机的ip不同且连不上 1.问题分析2.修改网段3.验证网络 1.问题分析 主要是打印机的网段和电脑不在同一个网段 2.修改网段 3.验证网络

Web前端三大主流框:React、Vue 和 Angular

在当今快速发展的 Web 开发领域&#xff0c;选择合适的前端框架对于项目的成功至关重要。React、Vue 和 Angular 作为三大主流前端框架&#xff0c;凭借其强大的功能和灵活的特性&#xff0c;赢得了众多开发者的青睐。本文将对这三大框架进行解析&#xff0c;帮助开发者了解它们…

dubbo复习:(12)服务器端的异步和客户端的异步调用

一、服务器端接口的定义和实现&#xff1a; package cn.edu.tju.service;import java.util.concurrent.CompletableFuture;public interface AsyncService {/*** 同步调用方法*/String invoke(String param);/*** 异步调用方法*/CompletableFuture<String> asyncInvoke(…

C/C++学习笔记 C读取文本文件

1、简述 要读取文本文件&#xff0c;需要按照以下步骤操作&#xff1a; 首先&#xff0c;使用该函数打开文本文件fopen()。其次&#xff0c;使用fgets()或fgetc()函数从文件中读取文本。第三&#xff0c;使用函数关闭文件fclose()。 2、每次从文件中读取一个字符 要从文本文…

整理一下win7系统java、python等各个可安装版本

最近使用win7系统&#xff0c;遇到了很多版本不兼容的问题&#xff0c;把我现在安装好的可使用的分享给大家 jdk 1.8 maven-3.9.6 centos 7 python 3.7.4 docker DockerToolbox-18.01.0-ce win10是直接一个docker软件&#xff0c;win7要安装这三个 datagrip-2020.2.3 d…

2.1Docker安装MySQL8.0

2.1 Docker安装MySQL8.0 1.拉取MySQL docker pull mysql:latest如&#xff1a;拉取MySQL8.0.33版本 docker pull mysql:8.0.332. 启动镜像 docker run -p 3307:3306 --name mysql8 -e MYSQL_ROOT_PASSWORDHgh75667% -d mysql:8.0.33-p 3307:3306 把mysql默认的3306端口映射…

CentOs-7.5 root密码忘记了,如何重置密码?

VWmare软件版本&#xff1a;VMware Workstation 16 Pro Centos系统版本&#xff1a;CentOS-7.5-x86 64-Minimal-1804 文章目录 问题描述如何解决&#xff1f; 问题描述 长时间没有使用Linux系统&#xff0c;root用户密码忘记了&#xff0c;登陆不上系统&#xff0c;如下图所示…

【网络安全】Web安全基础 - 第一节:使用软件及环境介绍

VMware VMware&#xff0c;是全球云基础架构和移动商务解决方案的佼佼者。 VMware可是一个总部位于美国加州帕洛阿尔托的计算机虚拟化软件研发与销售企业呢。简单来说&#xff0c;它就是通过提供虚拟化解决方案&#xff0c;让企业在数据中心改造和公有云整合业务上更加得心应…

QImage和QPixmap的区别和使用

一、基本概念和特点 QImage 概念&#xff1a;QImage是Qt库中用于处理图像数据的一个类。它提供了直接访问和操作图像像素的接口。特点&#xff1a; 可以独立于屏幕分辨率和设备处理图像。支持读取和保存多种图像格式&#xff0c;如PNG、JPEG、BMP等。可以在没有图形界面的情况…