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合作时,机器智能的支持和增强了他的人类智能。两者共同努力——不只是编写代码,更重要的是,共同思考架构和设计。

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

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

相关文章

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力,能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、W…

##21 深入理解文本处理:使用PyTorch进行NLP基础操作

文章目录 前言简介文本预处理实现分词构建词汇表 文本向量化构建简单的文本分类模型结论 前言 在现代深度学习应用中,文本处理是不可或缺的一部分,尤其在自然语言处理(NLP)领域。借助强大的框架如PyTorch,我们可以更加…

KIOXIA CD8P-R 1.92TB SSD KCD81PUG1T92数据中心读密集型

KIOXIA全新推出的CD8P-R系列数据中心级读密集型SSD - KCD81PUG1T92型号。这款SSD不仅在性能和可靠性方面表现出色,还能为您的数据中心应用带来前所未有的体验。 首先,让我们一起来看看KCD81PUG1T92的关键亮点: 超高性能: KCD81PUG1T92采用PCIe 5.0和NVMe 2.0规范,最高可提供…

JSpdf,前端下载大量表格数据pdf文件,不创建dom

数据量太大使用dom》canvas》image》pdf.addimage方法弊端是canvas超出 浏览器承受像素会图片损害,只能将其切割转成小块的canvas,每一次调用html2canvas等待时间都很长累积时间更长,虽然最终可以做到抽取最小dom节点转canvas拼接数据,但是死…

Linux基础之进程的优先级

目录 一、进程优先级的概念 二、进程优先级的查看 三、怎么修改进程优先级 四、进程饥饿 一、进程优先级的概念 cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linu…

特征衍生-多变量交叉组合特征衍生

https://www.bilibili.com/video/BV1Kg411n7jv?p21&vd_source08e23da22e328e8950aeb24d2001d586

.NET 4.8和.NET 8.0的区别和联系、以及查看本地计算机的.NET版本

文章目录 .NET 4.8和.NET 8.0的区别查看本地计算机的.NET版本 .NET 4.8和.NET 8.0的区别 .NET 8.0 和 .NET 4.8 之间的区别主要体现在它们的发展背景、目标平台、架构设计和功能特性上。下面是它们之间的一些主要区别: 发展背景: .NET 4.8 是.NET Fram…

美港通正规炒股市场沪指收跌0.82% 证券板块调整

5月15日电 15日,A股三大指数集体下挫。上证指数跌0.82%,报3119.9点;深证成指跌0.88%,报9583.54点;创业板指跌0.9%,报1838.89点。沪深京三市成交额7651亿元,其中沪深两市7611亿元,较上日缩量635亿元。沪深两市超3800只个股下跌。 美港通证券以其专业的服务和较低的管理费用在市…

数字集成电路物理设计[陈春章]——知识总结与精炼02

第二章 物理设计建库与验证 2.1 集成电路工艺与版图 自行了解,关于闩锁效应可查阅小编之前的文章。 2.2 设计规则检查(DRC) 定义:晶圆代工厂对各自不同工艺参数制定出满足芯片制造良率的同一工艺层及不同工艺层之间几何尺寸的…

ROS学习笔记(15)小车巡墙驾驶

0.前提 前一章我讲解了拉氏变换和PID,这一章我来讲解一下小车巡墙驾驶的理论和部分代码。 1.前情回顾 1.拉氏变换 拉普拉斯变换是要将时域问题转换成频域问题来处理。 2.PID控制器 转向角: 误差牺牲: 3.具体参看上一篇文章 2.巡墙驾驶…

【半监督学习】半监督学习中的时间集合

在本文中,我们提出了一种在半监督环境下训练深度神经网络的简单而高效的方法,在这种环境下,只有一小部分训练数据是有标签的。我们引入了self-ensembling技术,即利用网络在不同历时,最重要的是在不同正则化和输入增强条…

充电桩战火重燃,特来电、星星充电上演“龙虎斗”

配图来自Canva可画 小米Su7真的太火了,上市40天锁单量超过10万供不应求,给新能源汽车行业带来了新的活力,也促进了充电桩行业的发展。 据中国汽车工业协会数据,4月份新能源汽车产销分别完成87万辆和85万辆,同比分别增…

地表最强ChatGPT爆了!我来告诉你,它都有什么用

OpenAI刚刚发布了全新的 "GPT-4o",它不仅可以通过语音、视觉和文本进行推理,还在速度和价格上有了巨大的突破。它的速度提高了2倍,价格却降低了50%,而且生成速率比GPT-4 Turbo高出5倍。最令人惊喜的是,它将对…

【prometheus】prometheus基于consul服务发现实现监控

目录 一、consul服务发现简介 1.1 consul简介 二、prometheus配置 2.1 node-exporter服务注册到consul 2.2 修改prometheus配置文件 【Prometheus】概念和工作原理介绍_prometheus工作原理-CSDN博客 【Prometheus】k8s集群部署node-exporter 【prometheus】k8s集群部署p…

C语言之旅:动态内存管理

目录 一.为什么要有动态内存分配 二.malloc和free 2.1 malloc 2.2 free 2. 3malloc和free的使用 三. calloc 四. raelloc 4.1 代码示例: 4.2 注意事项: 4.3 对动态开辟空间的越界访问 4.4 对非动态开辟内存使⽤free释放 4.5 使用free释放⼀块…

在Python中防止某些字段被Pickle序列化

在Python中,如果你想防止某些字段被pickle序列化,可以使用__reduce__()方法来自定义pickle行为。__reduce__()方法允许你返回一个元组,其中包含要在对象被pickle时调用的函数以及传递给该函数的参数。下面就是我遇到的问题以及最终解决方案。…

2D Chests Assets - Mega Pack

科幻/奇幻/经典主题的箱子和容器。AAA质量,高分辨率,VFX,源PSD文件。 这是一个带有手绘套装的大包装: -【梦幻之栗】 -【科幻钱包】 AAA质量。高分辨率。一切都已准备就绪,可供使用。包括PSD文件。 在1.1版本中添加了VFX并将项目更新为URP。请注意,新的VFX仅适用于URP/HD…

Python中的数据可视化:填充等高线图matplotlib.pyplot.contourf()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化: 填充等高线图 matplotlib.pyplot.contourf() [太阳]选择题 关于代码描述正确的是? import matplotlib.pyplot as plt import numpy as np x …

基于若依的ruoyi-vue3.8.7的flowable支持指定接收人的流程审批前端部分

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

基于BF算法和KMP算法的病毒感染检测

案例引入: 实验任务: 代码实现: 注意:我以项目的形式编写此代码,编译环境为VS2022,代码移植可能会导致错误 mystring.h:存放结构体以及函数声明 #define _CRT_SECURE_NO_WARNINGS #pragma on…