与ChatGpt聊天,学习golang标签的反射机制

与ChatGpt聊天,学习golang标签的反射机制

ChatGPT火了以后,本拐先是恐惧,之后是拥抱。

最近很多编程知识的学习,都是通过 chatgpt来搞定。

众所周知,本拐就是一个啥技术都半斤八两的程序员,这次,为了学习golang中一些反射的机制,主要是tag属性,本拐又与chatgpt来了一次深入交流。

过程

本拐确实对golang中的tag属性所知甚少,所以先从json开始吧,挖个坑先。



 golang 中怎么用反射取到json

在 Golang 中,可以使用反射机制来获取一个对象的 json 表示。假设我们有一个结构体 Person 如下:

type Person struct {Name    string    `json:"name"`Age     int       `json:"age"`Address string    `json:"address"`
}

然后,我们可以使用以下代码来将一个 Person 对象转换成 json 字符串,并使用反射机制获取它:

import ("encoding/json""reflect"
)func main() {person := Person{"John", 30, "123 Main St."}// 将 person 转换为 json 字符串jsonBytes, _ := json.Marshal(person)jsonString := string(jsonBytes)// 通过反射获取 json 中的字段值value := reflect.ValueOf(person)for i := 0; i < value.NumField(); i++ {field := value.Type().Field(i)fieldName := field.Tag.Get("json")fieldValue := value.Field(i).Interface()fmt.Printf("%s: %v\n", fieldName, fieldValue)}
}

输出将会是:

name: John
age: 30
address: 123 Main St.

在这个例子中,我们使用 encoding/json 包将 person 对象转换为 json 字符串。然后,我们使用 reflect 包获取结构体的值,通过循环遍历所有字段并使用 Tag.Get 方法获取字段的 json 标签,最后使用 Field(i).Interface() 获取字段的值

56d787e8896cd6dab354bbe131e4cab7.jpeg




嘿嘿,这个问题回答的可不漂亮啊,本拐成功抓住了其中的不足。

 这个方式是不是有些性能损失?因为 json.Marshal(person) 时已经读取了一次

chatgpt成功地get到了我的点。

 是的,您是正确的。在上面的示例中,我们先将 person 对象转换为 JSON 字符串,然后再通过反射机制解析该字符串,这样可能会导致一些性能损失。

如果您需要获取结构体字段的 JSON 标签,而不必将整个结构体转换为 JSON 字符串,您可以使用 reflect 包中的 Type 方法来获取结构体类型,并通过 Type 方法中的 Field 方法获取字段的类型信息。然后,您可以使用 StructTag 方法获取该字段的标签信息,进而获取 JSON 标签。

下面是一个示例:

import ("reflect"
)func main() {person := Person{"John", 30, "123 Main St."}t := reflect.TypeOf(person)for i := 0; i < t.NumField(); i++ {field := t.Field(i)jsonTag := field.Tag.Get("json")fmt.Printf("%s: %s\n", field.Name, jsonTag)}
}

在这个示例中,我们使用 reflect 包中的 Type 方法获取 person 对象的类型信息,并通过 Type 方法中的 Field 方法获取字段的类型信息。然后,我们使用 StructTag 方法获取该字段的标签信息,并通过 Tag.Get 方法获取 JSON 标签。

这种方法避免了将整个结构体转换为 JSON 字符串的开销,因此可能会更加高效。

c0a4a5c001061150248ec1467d534c60.jpeg


本拐毕竟是乱炖程序员,所以,优化还是要有的。

 如果 这个方法被反复调用,加map是否可以提高他的性能

ChatGPT 一如既往的聪明

 如果您需要在多个不同的地方反复获取结构体字段的 JSON 标签,可以考虑将字段的 JSON 标签缓存到一个 map 中,以提高性能。这样,当需要获取 JSON 标签时,只需要从缓存中查找即可,而不需要每次都使用反射获取。

下面是一个示例:

import ("reflect"
)var jsonTagCache = make(map[string]string)func getJSONTag(field reflect.StructField) string {if jsonTag, ok := jsonTagCache[field.Name]; ok {return jsonTag}jsonTag := field.Tag.Get("json")jsonTagCache[field.Name] = jsonTagreturn jsonTag
}func main() {person := Person{"John", 30, "123 Main St."}t := reflect.TypeOf(person)for i := 0; i < t.NumField(); i++ {field := t.Field(i)jsonTag := getJSONTag(field)fmt.Printf("%s: %s\n", field.Name, jsonTag)}
}

在这个示例中,我们定义了一个全局变量 jsonTagCache,它是一个 map[string]string 类型的缓存。然后,我们定义了一个函数 getJSONTag,该函数接受一个 reflect.StructField 类型的参数,并返回该字段的 JSON 标签。在该函数中,我们首先从缓存中查找 JSON 标签,如果找到了就直接返回,否则就使用 Tag.Get 方法获取 JSON 标签,并将其添加到缓存中,然后返回 JSON 标签。

在 main 函数中,我们使用 reflect 包中的 Type 方法获取 person 对象的类型信息,并通过 Type 方法中的 Field 方法获取字段的类型信息。然后,我们调用 getJSONTag 函数获取字段的 JSON 标签。

通过缓存 JSON 标签,可以避免每次都使用反射获取标签的开销,因此可以提高性能。但是请注意,如果您在处理的结构体类型非常多,缓存可能会占用大量内存。如果您需要处理大量的结构体类型,请考虑限制缓存的大小或使用 LRU 缓存等方式来优化缓存的性能和内存使用。

e1f6a5f01fff569ea9bcb885376af679.jpeg


好了,终极目的要达成了,问一下自定义标签的问题。

 我如果 把json换成我的一个自定义标签,比如neo4j-colum 是不是也可以用类似的机制来实现类似功能。

 是的,您可以使用类似的机制来获取结构体字段的自定义标签,例如 neo4j-column 标签。

只需要将 getJSONTag 函数中的 Tag.Get("json") 方法替换为 Tag.Get("neo4j-column") 即可。具体来说,您可以按照以下方式修改 getJSONTag 函数:

func getCustomTag(field reflect.StructField, tagName string) string {cacheKey := fmt.Sprintf("%s_%s", field.Name, tagName)if tag, ok := customTagCache[cacheKey]; ok {return tag}tag := field.Tag.Get(tagName)customTagCache[cacheKey] = tagreturn tag
}

在这个示例中,我们将 getJSONTag 函数重命名为 getCustomTag,并将 Tag.Get("json") 方法替换为 Tag.Get(tagName) 方法,其中 tagName 是您要获取的自定义标签名称。我们还修改了缓存键的生成方式,将字段名和标签名组合在一起作为缓存键,以避免不同的标签名使用相同的缓存键。

您可以按照以下方式使用 getCustomTag 函数来获取结构体字段的 neo4j-column 标签:

person := Person{"John", 30, "123 Main St."}t := reflect.TypeOf(person)
for i := 0; i < t.NumField(); i++ {field := t.Field(i)columnTag := getCustomTag(field, "neo4j-column")fmt.Printf("%s: %s\n", field.Name, columnTag)
}

在这个示例中,我们使用 getCustomTag 函数获取字段的 neo4j-column 标签。

ae817228688df30a52d281376a6adfad.jpeg

注意这里,chatgpt自动纠正了错误的拼写

结论

ChatGPT火了以后,很多朋友说这个东西没有什么用,或是用处不大。

本拐以为,用好这个东西,在于提问的技巧,所以,用这个文章做了一个引子。

您觉得如何?

关于老拐瘦

中年争取不油不丧积极向上的码农一名

咖啡,摄影,骑行,音乐

样样通,样样松

喜欢可以关注一下公众号 

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

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

相关文章

苹果Message应用图标被指抄袭微信、HipChat图标

苹果发布的新版桌面系统os x mountain lion预览版中&#xff0c;message程序可谓是大家最为关心的功能之一&#xff0c;这款程序的图标也引起不少争议。目前所有的mac用户都可以安装这款小程序测试&#xff0c;无限制的与ios设备间发送短信和图片。 这两年微信成为了时尚一族必…

iPhone 图标设置

-- 2012-03-23 让你的应用支持新iPad的Retina显示屏 一、应用图片 标准iOS控件里的图片资源&#xff0c;苹果已经做了相应的升级&#xff0c;我们需要操心的是应用自己的图片资源。就像当初为了支持iPhone 4而制作的2x高分辨率版本&#xff08;译者&#xff1a;以下简称高分&…

IOS App 的图标和启动图的烦恼

前言&#xff1a; 好多iOS App的开发者都会面临的一个问题&#xff0c;那就是 App 的图标&#xff08;icon&#xff09; 和启动图&#xff08;launch images&#xff09; 。 一些没有经验&#xff08;指的是没做过App审计的&#xff09;的UI设计师&#xff0c;不知道该怎么做。…

iOS替换应用图标

iOS 动态替换应用icon Xcode 集成多套测试 App 图标如何给App添加多套图标如何验证是否配置多套图标成功了如何通过代码动态替换应用图标如何无感替换应用图标 Xcode 集成多套测试 App 图标 实现多套 App 图标&#xff0c;依赖** Xcode13及以上版本** 。 在Xcode13之前&#…

IOS APP 图标

像我一样记不住iOS应用图标像素尺寸的开发者不在少数&#xff0c;我经常需要查询不同设备上的应用尺寸&#xff0c;为了方便自己、方便大家&#xff0c;我制作了下面的图表供大家参考。 iPhone、iPodTouch以及一般通用的应用图标像素尺寸是多少? iPhone和iPodTouch应用需要一…

Mac OS 状态栏图标管理

移动位置排列状态栏图标 按Command键&#xff0c;直接用鼠标拖动图标即可移动图标的位置。 、 隐藏或删除状态栏图标 如果状态栏图标太多你会发现整个屏幕的长度都是不够用&#xff0c;这个时候要果断的删除那些长时间不用的图标。按住Command键并点按该图标&#xff0c;将…

GPT-4会让多少美国人失业?OpenAI:高收入工作会面临更大影响

GPT&#xff08;生成式预训练转换器&#xff09;就是 GPT&#xff08;通用目的技术&#xff09;&#xff0c;大型语言模型&#xff08;LLM&#xff09;将会怎样影响劳动力市场&#xff1f; 上周二&#xff0c;OpenAI 官宣 GPT-4 引起轩然大波&#xff0c;比其广受欢迎的前身 GP…

地表最强AI,GPT-4专治各种不服

在火遍全球后&#xff0c;OpenAI发布了多模态预训练大模型GPT-4&#xff0c;相比上一代GPT-3.5在几个方面有了明显升级&#xff0c;GPT-4&#xff0c;就像是为“专治ChatGPT吐槽者的各种不服”而生。 GPT-3.5仅接受文本输入&#xff0c;而GPT-4可以接受图像和文本输入&#xff…

[230608] 阅读TPO58汇总|7:30-9:00+17:05

目录 ​​​​​​​ TPO58 1 The Development of Instrumental Music [3]修辞目的题 举例说明的作用 [9]句子插入题 [10]小结题 2 Pinyon Pines and Pinyon Jays [4]否定事实信息题 [5]修辞目的题 段落在全篇的作用 [10]小结题 3 The Rise of Classic Maya Civi…

7 Papers | 超越GPT 3.5的小模型;对ChatGPT摸底考试

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 本周论文包括2D 图像脑补 3D 人体&#xff1b;亚马逊发布超越 GPT 3.5 的小模型等研究。 转自《机器…

阿里家属快当不下去了

往期热门文章&#xff1a; 1、C 首超 Java&#xff01;地位不保&#xff1f; 2、IntelliJ IDEA终于支持对Redis 的可视化窗口操作了&#xff0c;真香&#xff01; 3、ChatGPT能接入微信了&#xff01; 4、Java 反射慢&#xff1f;它到底慢在哪&#xff1f; 5、GitHub 被超火的 …

2023.2.27-3.5 AI行业周刊(第139期):裁员?主动选择or被动选择?

上周五晚和一个好朋友见面&#xff0c;他在一家AI公司做首席科学家。 聊天的时候&#xff0c;讨论到一个话题&#xff1a;40岁之后的人生&#xff0c;如何才能过的更舒适&#xff0c;不焦虑&#xff1f; 我和他都是90年左右&#xff0c;已经是往不惑之年奔赴的年纪了&#xf…

ChatALL:发现最佳答案的神奇AI机器人!

“ 有了这个神器软件&#xff0c;AI 聊天机器人的牌子随便你翻。” 最近研究学习AI聊天机器人&#xff0c;注册了不少AI大模型账号&#xff0c;有时候有问题问完了ChatGPT&#xff0c;就想看看其他机器人的回答&#xff0c;体验和比较一下。 正好看到一个符合我这类重度AI患者的…

我的周刊(第078期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 awesome-chatgpt-prompts-zh[1] ChatGPT 中文调教…

程序员必备的免费AI生产力(摸鱼)工具,最后一个,人手必备

最近ChatGPT等AI技术风靡全球&#xff0c;对于普通大众来说&#xff0c;越来越多的人开始关注智能时代对我们生活的影响。它颠覆了写作、办公、绘画、音视频、图像处理、UI 设计等领域&#xff0c;并涌现出了一批具有颠覆性的应用。 在程序员领域&#xff0c;许多 AI 工具已经涌…

chatgpt赋能Python-python_dingtalk

Python DingTalk&#xff1a;高效企业通讯利器 当今互联网时代&#xff0c;企业内部沟通必不可少。在成千上万的企业应用中&#xff0c;DingTalk作为高效沟通工具被越来越多的企业所使用。Python DingTalk库的出现&#xff0c;为企业带来了更加方便快捷的通讯方式。 什么是Py…

和chatGPT的一些对话记录

指定pom文件jar引的位置方法&#xff0c;chatGPT是这样说的 Unknown system variable ‘query_cache_size’&#xff0c;错误原因 一秒执行指定方法5次 1秒内并行指定指定方法 解释代码含义

泰安柒柒:ChatGPT的用途有哪些?

大家好&#xff0c;当今的ChatGPT是一个强大的语言模型&#xff0c;它利用大规模的自然语言处理和机器学习算法&#xff0c;可以进行自然而流畅的对话&#xff0c;理解自然语言问题并回答。ChatGPT拥有极强的自然语言处理能力&#xff0c;可以用于各种任务&#xff0c;如文本生…

竞彩公司每日足球比赛比分预测!

软件不是单纯的乱预测&#xff0c;是爬取了某赔率公司的数据&#xff0c;根据每日比赛的赔率来进行最有可能出现的比分来预测比赛结果&#xff0c;可以作为很好的帮助你分析比赛

世界杯:用Python分析热门夺冠球队

火热的世界杯即将拉开序幕。在比赛开始之前&#xff0c;我们不妨用 Python 来对参赛队伍的实力情况进行分析&#xff0c;并大胆的预测下本届世界杯的夺冠热门球队。 通过数据分析&#xff0c;可以发现很多有趣的结果&#xff0c;比如&#xff1a; 找出哪些队伍是首次进入世界…