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

chatgpt/2023/9/27 17:01:27

目录

背景

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】

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

费舍尔线性分辩分析(Fisher‘s Linear Discriminant Analysis, FLDA)

费舍尔线性分辩分析(Fisher’s Linear Discriminant Analysis, FLDA) 目录 费舍尔线性分辩分析(Fishers Linear Discriminant Analysis, FLDA)1. 问题描述2. 二分类情况3. 多分类情况4. 代码实现4.1 二分类情况4.2 多分类情况 5. 参考资料 1. 问题描述 为解决两个或多个类别的…

Elasticsearch搜索引擎系统入门

目录 【认识Elasticsearch】 Elasticsearch主要应用场景 Elasticsearch的版本与升级 【Elastic Stack全家桶】 Logstash Kibana Beats Elasticsearch在日志场景的应用 Elasticsearch与数据库的集成 【安装Elasticsearch】 安装插件 安装Kibana 安装Logstash 【认…

Vue3使用vxetable进行表格的编辑、删除与新增

效果图如下: vxetable4传送门 一、引入插件 package.json中加入"vxe-table": "4.0.23",终端中执行npm i导入import {VXETable, VxeTableInstance

Redis学习路线(6)—— Redis的分布式锁

一、分布式锁的模型 &#xff08;一&#xff09;悲观锁&#xff1a; 认为线程安全问题一定会发生&#xff0c;因此在操作数据之前先获取锁&#xff0c;确保线程串行执行。例如Synchronized、Lock都属于悲观锁。 优点&#xff1a; 简单粗暴缺点&#xff1a; 性能略低 &#x…

Maven pom.xml文件中build,plugin标签的具体使用

<build> 标签 <build> 标签是 pom.xml 文件中一个重要的标签&#xff0c;用于配置 Maven 项目的构建过程。在 <build> 标签下&#xff0c;可以配置构建相关的设置&#xff0c;包括源代码目录、输出目录、插件配置等。 以下是 <build> 标签的详细使用方…

Android 面试题 异常捕获 四

&#x1f525; 为什么要捕获奔溃 &#x1f525; 因为在开发或者测试阶段不能做到100%的问题解决&#xff0c;因为 app 上线之后会有你想不到的各种各样的使用的场景&#xff0c;而发生问题时用户只能描述一下怎么怎么怎么就出现了问题。也许反馈到开发这边可以100%复现那就可以…

深入浅出Pytorch函数——torch.no_grad

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 禁用梯度计算的上下文管理器。当我们确信不会调用Tensor.backward()时&#xff0c;禁用梯度计算对推理很有用。它将减少计算的内存消耗&#xff0c;否则我们需要设置requires_gradTrue。在这种模式下&#xff0c;即使输入的…

如何进行软件回归测试

什么是软件回归测试&#xff0c;如何进行回归测试&#xff0c;进行回归测试时有哪些常用的方法&#xff1f; 回归测试是指修改了旧代码后&#xff0c;重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误的一种测试方法。回归测试是指重复以前的全部或部分的相同功能…
推荐文章