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

【Golang 接口自动化07】struct转map的三种方式

目录

背景

struct转map

使用json模块

使用reflect模块

使用第三方库

测试

总结

资料获取方法


背景

我们在前面介绍过怎么使用net/http发送json或者map数据,那么它能不能直接发送结构体数据呢?我们今天一起来学习结构体struct转map的三种方法,为后续做铺垫。

struct转map

使用json模块

直接使用json.Marshal方法来强制转化struct。

参考代码:

func JSONMethod(content interface{}) map[string]interface{} {var name map[string]interface{}if marshalContent, err := json.Marshal(content); err != nil {fmt.Println(err)} else {d := json.NewDecoder(bytes.NewReader(marshalContent))d.UseNumber() // 设置将float64转为一个numberif err := d.Decode(&name); err != nil {fmt.Println(err)} else {for k, v := range name {name[k] = v}}}return name
}

使用reflect模块

通过reflect模块来获取结构体的key值和value值,然后直接进行组装。这种方法不能识别结构体中的tag,所以无法兼容首字母小写,而其他字母存在大写的情况.
参考代码:

func ReflectMethod(obj interface{}) map[string]interface{} {t := reflect.TypeOf(obj)v := reflect.ValueOf(obj)var data = make(map[string]interface{})for i := 0; i < t.NumField(); i++ {data[strings.ToLower(t.Field(i).Name)] = v.Field(i).Interface()}return data
}

使用第三方库

第三种方法是使用第三方库github.com/fatih/structs,他提供了比较丰富的函数,让我们可以像python中一样轻松的获取所有的key值(structs.Names(server)),所有的value值(structs.Values(server)),甚至直接进行类型判断(structs.IsZero(server))等等。

更详细的信息可以咨询我查阅

测试

type Human struct {Name     string `json:"name"`Age      int    `json:"age"`Profile  string `structs:"profile"`IsGopher bool   `json:"isGopher"`
}func main() {human := Human{"Detector", 18, "A tester", true}fmt.Println("Json method:", JSONMethod(human))fmt.Println("========")fmt.Println("Reflect method:", ReflectMethod(human))fmt.Println("========")fmt.Println("Third lb:", structs.Map(human))
}

输出如下:

总结

从测试结果可以看到,三种方式都能完成struct转map,但是reflect方法无法识别结构体中的tag,第三方库只能使用tag structs,所以如果考虑兼容性(考虑到协同开发)和尽量使用官方库的原则,推荐使用第一种方法(json转换)。

  • reflect.Field
  • json
  • structs

资料获取方法

【留言777】

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

相关文章:

【Golang 接口自动化07】struct转map的三种方式

目录 背景 struct转map 使用json模块 使用reflect模块 使用第三方库 测试 总结 资料获取方法 背景 我们在前面介绍过怎么使用net/http发送json或者map数据&#xff0c;那么它能不能直接发送结构体数据呢&#xff1f;我们今天一起来学习结构体struct转map的三种方法&am…...

华为数通HCIA-网络模型

TCP 网络通信模式 作用&#xff1a;指导网络设备的通信&#xff1b; OSI七层模型&#xff1a; 7.应用层&#xff1a;由应用层协议&#xff08;http、FTP、Telnet.&#xff09;为应用程序产生对应的数据&#xff1b; 6.表示层&#xff1a;将应用层产生的数据转换成网络设备看…...

端口的解说

端口的定义 端口是指计算机与外部交互的出入口&#xff0c;可以按照所见性分为物理端口和虚拟端口 物理端口&#xff1a; USB、HDMI、PDP、VGA、CUP等虚拟端口&#xff1a;mysql——>25, ssh——>22 、http——>80 、https——>443等 IP地址只能锁定到计算机&am…...

“深入了解Spring Boot: 快速构建微服务应用的利器“

标题&#xff1a;深入了解Spring Boot: 快速构建微服务应用的利器 摘要&#xff1a; Spring Boot是一个基于Spring框架的开发工具&#xff0c;旨在提供快速、方便地构建微服务应用。本文将深入探讨Spring Boot的特点和优势&#xff0c;以及如何使用示例代码构建一个简单的微服…...

华为OD机试 Java 实现【批量处理任务】【2023 B卷 200分】,二分查找

目录 专栏导读一、题目描述二、输入描述三、输出描述四、二分查找五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;…...

C# 2的幂

231 2的幂 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1a; 输入&#xff1a;n 1 输出&a…...

linux vi指令大全

vi 使用以及快捷键 vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本&#xff0c;vi编辑器是完全相同的&#xff0c;因此您可以在其…...

jdk8使用okhttp发送http2请求

本文主要用于工作记录&#xff0c;在项目中遇到了就记录一下 在早期&#xff0c;原生的JDK8是不支持HTTP/2协议的&#xff0c;所以&#xff0c;要想使用这个特性&#xff0c;需要有web服务器和应用环境的支持&#xff0c; 例如&#xff1a;在VM中增加-Xbootclasspath/p:/Users…...

virbr是什么设备

virbr是什么设备 virbr是一个虚拟桥接网络设备&#xff0c;通常由虚拟机管理程序&#xff08;如 KVM、VirtualBox 或者 libvirt 等&#xff09;创建和管理。它用于在宿主机和虚拟机之间进行网络连接&#xff0c;以便虚拟机可以通过宿主机访问网络。 默认情况&#xff0c;libv…...

MyBatis缓存-提高检索效率的利器--二级缓存

文章目录 缓存-提高检索效率的利器缓存-官方文档二级缓存基本介绍二级缓存原理图 二级缓存快速入门快速入门注意事项和使用陷阱理解二级缓存策略的参数 四大策略如何禁用二级缓存mybatis 刷新二级缓存的设置 缓存-提高检索效率的利器 缓存-官方文档 文档地址: https://mybati…...

开心档之CSS !important 规则

CSS !important 规则 CSS !important 规则 CSS是网页中最常用的样式语言&#xff0c;用来改变网页的颜色、字体、布局等等。但是当多个样式规则作用于同一个元素上时&#xff0c;由于优先级的差异&#xff0c;可能会出现样式被覆盖的情况。为了解决这个问题&#xff0c;CSS中提…...

深入篇【C++】手搓模拟实现list类(详细剖析底层实现原理)模拟实现正反向迭代器【容器适配器模式】

深入篇【C】手搓模拟实现list类(详细剖析底层实现原理&#xff09;&& 模拟实现正反向迭代器【容器适配器模式】 Ⅰ.迭代器实现1.一个模板参数2.两个模板参数3.三个模板参数 Ⅱ.反向迭代器实现1.容器适配器模式 Ⅲ.list模拟实现1.定义结点2.封装结点3.构造/拷贝4.迭代器…...

OnTrigger的几种情况

在Unity中&#xff0c;OnTrigger是一种用于处理碰撞事件的函数。它通常用于监测对象之间的触发器&#xff08;Collider&#xff09;交互&#xff0c;并在特定的情况下触发相应的逻辑。在Unity中&#xff0c;有以下几种类型的OnTrigger事件&#xff1a;OnTriggerEnter、OnTrigge…...

地产变革中,物业等风来

2023年7月&#xff0c;也许是中国房地产行业变局中的一个大拐点。 中信建投研报表示&#xff0c;政治局会议指出当前我国房地产形势已发生重大变化&#xff0c;要适时调整优化政策&#xff0c;为行业形势定调……当前房地产行业β已至。 不久前&#xff0c;国家统计局公布了2…...

(五)springboot实战——springboot自定义事件的发布和订阅

前言 本节内容我们主要介绍一下springboot自定义事件的发布与订阅功能&#xff0c;一些特定应用场景下使用自定义事件发布功能&#xff0c;能大大降低我们代码的耦合性&#xff0c;使得我们应用程序的扩展更加方便。就本身而言&#xff0c;springboot的事件机制是通过观察者设…...

AVFoudation - 音频测量

文章目录 关于 metering使用关于 metering AVAudioPlayer 和 AVAudioRecorder 都有 metering 相关方法,用于音频测量 /* metering */@property(getter=isMeteringEnabled) BOOL meteringEnabled; /* turns level metering on or off. default is off. */ - (void)updateMet…...

学习记录——TransNormerLLM

Scaling TransNormer to 175 Billion Parametes 线性注意力的Transformer大模型 2023 Transformer 存在局限。首要的一点&#xff0c;它们有着对于序列长度的二次时间复杂度&#xff0c;这会限制它们的可扩展性并拖累训练和推理阶段的计算资源和时间效率。 TransNormerLLM 是首…...

【Qt】利用Tool Button控件创建下拉菜单按钮

功能描述 利用qt进行界面设计和开发&#xff0c;创建下拉按钮。 详细实现 1、在qt侧工具栏利用设计打开.ui文件 2、创建按钮 创建一个Tool Button按钮&#xff0c;并在属性窗口中的QToolButton栏中选中MenuButtonPopup属性。 3、创建action 在Action编辑器创建对应的ac…...

1.2 eureka注册中心,完成服务注册

目录 环境搭建 搭建eureka服务 导入eureka服务端依赖 编写启动类&#xff0c;添加EnableEurekaServer注解 编写eureka配置文件 启动服务,访问eureka Euraka服务注册 创建了两个子模块 在模块里导入rureka客户端依赖 编写eureka配置文件 添加Services 环境搭建 创建父…...

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块,文件权限修改

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…...

回归预测 | MATLAB实现PSO-GPR粒子群优化高斯过程回归多输入单输出回归预测

回归预测 | MATLAB实现PSO-GPR粒子群优化高斯过程回归多输入单输出回归预测 目录 回归预测 | MATLAB实现PSO-GPR粒子群优化高斯过程回归多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于PSO-GPR基于粒子群算法优化高斯过程回归的数据回归预…...

python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段

目录 运行情况&#xff1a; 代码&#xff1a; 承接 【python_PyQt5开发验证K线视觉想法工具V1.0】 博文 https://blog.csdn.net/m0_37967652/article/details/131966298 运行情况&#xff1a; 添加线段数据在K线图中用线段绘制出来 代码&#xff1a; 1 线段标记的数据格式…...

中文多模态医学大模型智能分析X光片,实现影像诊断,完成医生问诊多轮对话

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…...

企业服务器数据库被360后缀勒索病毒攻击后采取的措施

近期&#xff0c;360后缀勒索病毒的攻击事件频发&#xff0c;造成很多企业的服务器数据库遭受严重损失。360后缀勒索病毒是Beijingcrypt勒索家族中的一种病毒&#xff0c;该病毒的加密形式较为复杂&#xff0c;目前网络上没有解密工具&#xff0c;只有通过专业的技术人员对其进…...

FFmpeg-两个文件mix重采样以那个为主

ffmpeg -i 2ch-44.1k.wav -i 2ch-16k.wav -filter_complex " \ [0:a][1:a]amixinputs2[aout]" \ -map [aout] -f null -ffmpeg -i 2ch-44.1k.wav -i 2ch-16k.wav -filter_complex " \ [0:a][1:a]amixinputs2[aout]" \ -map [aout] -f null -对比发现&#…...

【WebGL】初探WebGL,我了解到这些

WebGL&#xff08;Web图形库&#xff09;是一种强大的技术&#xff0c;允许您在Web浏览器中直接创建交互式的3D图形和动画。它利用现代图形硬件的能力来呈现令人惊叹的视觉效果&#xff0c;使其成为Web开发人员和计算机图形爱好者必备的技能。 WebGL基础知识 WebGL基于OpenGL …...

fwft fifo和standard fifo

fifo共有两种,分别是standard fifo和fwft fifo,其中,前者的latency=1,即rd_en信号有效且fifo非空时,数据会在下一个周期出现在fifo的读数据端口。而后者,即fwft fifo的latency=0,也就是说,rd_en信号有效的当拍,数据就会出现在读端口上。这里,fwft是First-word-Fall-T…...

pdf阅读器哪个好用?这个阅读器别错过

pdf阅读器哪个好用&#xff1f;PDF是一种流行的文件格式&#xff0c;可以保留文档的原始格式、布局和字体。与其他文档格式相比&#xff0c;PDF在不同设备和操作系统上的显示效果更为一致&#xff0c;确保文档内容的准确性和可读性。在阅读一些PDF文件的时候&#xff0c;使用一…...

【LeetCode】下降路径最小和

下降路径最小和 题目描述算法分析编程代码 链接: 下降路径最小和 题目描述 算法分析 编程代码 class Solution { public:int minFallingPathSum(vector<vector<int>>& matrix) {int n matrix.size();vector<vector<int>> dp(n1,vector(n2,INT_M…...

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】 1 实现\封装Message模块 zinx/ziface/imessage.go package zifacetype IMessage interface {GetMsdId() uint32GetMsgLen() uint32GetMsgData() []byteSetMsgId(uint32)SetData([]byte)SetData…...