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

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

三频BE12000国补到手2549元! ROG 魔盒Pro WIFI7电竞AI路由器上架

《三频BE12000国补到手2549元!ROG魔盒ProWIFI7电竞AI路由器上架》近日,华硕带来了ROG魔盒ProWIFI7电竞AI路由器(ROGSTRIXGR7Pro),目前新... 华硕推出了ROG 魔盒Pro WIFI7电竞AI路由器(ROG STRIX GR7 Phttp://www.cppcn