Go语言不再难!跟随ChatGPT轻松攻克编程难关

2024-05-16 13:20

本文主要是介绍Go语言不再难!跟随ChatGPT轻松攻克编程难关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发人员(包括我在内)通常偏好边学习边实践的方式。这不仅仅是我与LLM协作的核心准则之一,也是最关键的准则:因为你是在任务导向的学习过程中积累知识,这种学习方式不是预先的——它基于实时的、可感知的情境。

当资深开发者与LLM携手时,其机器的智能能够扩展和提升开发者自身的智慧。

对于我个人而言,优势非常明显。在LLM时代编写Steampipe的ODBC插件,与我之前未受此类辅助的时期相比,变得更为轻松。当然,这只是一个个人主观的评价。因此,当我在寻找机会与其他插件开发者交换心得时,詹姆斯·拉米雷兹在我们的社区Slack上宣布,他为Kolide API构建了一个全新插件。

我邀请他分享他构建插件的经历,他慷慨地与我分享了一次长时间的对话,是关于他与ChatGPT的交流。在这次对话中,他熟悉了三个新的技术领域:Kolide API、Go语言以及Steampipe插件框架。

作为额外的挑战:虽然插件开发者通常会寻找一个适合他们API目标的Go SDK,但这次情况并非如此。因此,需要创建一个Kolide API的Go包装器,并将其集成到插件中。

1、测试ChatGPT对Go语言的能力
詹姆斯开始了一些热身练习。首先,他测试了ChatGPT对Go语言的能力,他提供了几个他编写的Go函数,这些函数用于调用Kolide的/devices/和/devices/ID接口,并要求对其进行改写,以分离两个函数间共享的逻辑部分。

紧接着,他探讨了如何使用简单的可变参数与更复杂的函数选项模式来处理函数的可选参数。他发现,采用一个Search结构的切片来封装Kolide查询参数的字段/操作符/值的方法——已经足够应对需求。他要求一个函数来序列化这样的Search结构切片为REST URL,然后对ChatGPT提出的方案进行完善,创建了最终版的serializeSearches,添加了对友好名称映射到参数以及使用字符串构建器的支持。

其中一些改进,例如使用字符串构建器,是由名为CodeRabbit的AI驱动的机器人提出的,它提供了有益的代码审查。他提到,这种反馈有助于你和你的团队集中精力看大局,因为它负责处理细节,并且经常(尽管不总是)提供可操作的建议。

这个AI还从更广阔的视野总结拉取请求,并评估关闭的PR是否解决了其链接问题中陈述的目标。

2、映射操作符
詹姆斯继续研究如何将Steampipe操作符(如QualOperatorEqual)映射到Kolide操作符(如Equals)。这里,ChatGPT建议的方法最终被确认为应该摒弃的复杂方法,取而代之的是更为简洁明了的策略。

但正如詹姆斯在我们访谈中所确认的,即使是最终会被抛弃的版本,它们的生成也是有益的,因为它们允许进行合理的迭代,而不是手动编码。在这个过程中,他学习到了Go语言的基本惯用法。

詹姆斯问:

Go语言中有do-while循环吗?

ChatGPT回答:

没有,但是……

詹姆斯继续问:

Go语言有三元运算符吗?

ChatGPT回答:

没有,但是……

詹姆斯又问:

如何在map[string]string中添加内容?

ChatGPT解释道:

可以这样做……

3、借助反射增强的访问者模式
在掌握了基础知识并为Kolide API开发出Go客户端后,詹姆斯准备开始着手真正的插件开发:定义表格,将从API包装器返回的Go类型映射到Steampipe模型以管理这些表的SQL查询。

像所有插件开发者一样,他从一个能列出一系列资源的表开始,逐步通过添加过滤器和分页功能来增强它。在添加了第二个表后,他开始考虑如何抽象常见的模式和行为。最终成果是一种优雅的访问者模式实现。以下是与表kolide_device和kolide_issue相对应的Steampipe List函数:

以下是所有插件表都会使用的通用listAnything函数:

通过这种设置,为插件添加新表几乎完全是声明式的:你只需定义模式,以及建立SQL查询中where(或join)子句与API级别过滤器之间桥梁的KeyColumns及其关联操作符。

然后编写一个小型的List函数,定义一个访问者,并把它传递给通用的listAnything函数,该函数封装了查询参数的编组、建立API客户端连接、调用API、解包响应成集合,以及遍历集合将项目流式传递给Steampipe的外部数据包装器。

詹姆斯在ChatGPT的帮助下开始了Go中访问者模式的惯用实现。这意味着他学习了如何为访问者函数定义类型,并声明一个满足该类型的函数。

每个表的访问者封装了对API客户端的调用,并返回了一个接口。这一过程相当通用化,但访问者的响应是特定于包装的API响应的Go类型,因此需要为每个表编写不同的List函数。詹姆斯提出疑问:“在res变量上的字段引用需要在运行时指定为可变类型。你有解决方案吗?”

ChatGPT建议使用反射,以便调用如listAnything(ctx, d, h, "kolide_device.listDevices", visitor, "Devices")时,传递的名称(例如"Devices")让listAnything能够不依赖类型地访问响应结构的字段。

有了这一点,listAnything真正成了一个完全通用的Steampipe List函数。这个解决方案减少了对反射的使用,并保持了Go在API层和Steampipe层的强类型检查。

 背景:免费AI问答交流-GPT

4、LLM协助意味着什么?
这并不意味着LLM可以直接回答像“请为Kolide API创建Steampipe插件”这样的提示,并编写出体现复杂设计模式的插件。

对我和詹姆斯来说,大型模型辅助编程意味着更有趣的事:“让我们探讨一下为Kolide API编写插件的过程。”这就像与橡皮鸭对话,大声思考需求和策略(编者注:“橡皮鸭调试法”指的是通过向一个假想的听众解释代码来寻找问题的解决方法)。LLM就是一个能给出回答的橡皮鸭。

有时,它的答案可以直接使用,有时则不行,但不管怎样,这些回答通常能帮助你清晰地思考。

作为一位经验丰富的资深软件工程师,詹姆斯原本可以独立解决问题,但这可能会花费更多时间。他原本会花费大量时间阅读文章和文档,而不是通过实际操作来学习。同时,没有那么多的时间可供他这样做!正如我现在从许多其他人那里听到的,LLM提供的加速经常是实现想法与能力执行之间的差别所在。

詹姆斯还提到了一个我未曾考虑过的开源角度。在LLM之前,他不会完全公开地进行这项工作。“我会一直保持私密,直到我感觉更有信心,”他说,“但这次从一开始就是公开的,我对此感到高兴。”这使得与Turbot团队的联系变得更早而不是更晚。

这不是自动化的故事,而是增强现实的故事。当像詹姆斯·拉米雷兹这样的资深开发者与LLM合作时,机器智能的支持和增强了他的人类智能。两者共同努力——不只是编写代码,更重要的是,共同思考架构和设计。

这篇关于Go语言不再难!跟随ChatGPT轻松攻克编程难关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995027

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal