我发布了自己第一个由ChatGPT辅助开发的开源项目goattribute

需求产生

前两天在工作过程中又遇到了一直以来困惑我的一个问题,就是Go配置项的管理问题。

在开发一个新项目的时候,往往涉及到配置项的管理。个人小项目可能会通过配置文件来传入、环境变量来传入,也可能通过命令行参数来传入,公司级别的项目还可能用到各种各样的config center。那么,如何来管理这些配置项就会很麻烦。

在我的习惯中,通常会使用至少两种方式来传入配置——如配置文件加命令行。原因有三:

  • 大部分情况下我运行的程序无需进行定制化,此时常使用默认配置文件。但有时候我们要临时修改一些选项,可以直接通过命令行参数传入覆盖默认配置

  • 我通常会将默认配置文件直接添加到Git仓库里,但其中有部分包含敏感信息的配置(如加密密钥),我需要通过其他方式传入,如环境变量、命令行等

  • 程序如果需要同时在测试环境和生产环境运行,我可以通过命令行选项来控制一些选项,而无需准备两个不同的配置文件

以往在命令行覆盖配置文件中配置项的时候,有一个很大的痛点就是,我不可能给每一个配置项都编写一个对应的命令行参数,而且随着项目的迭代,每次添加新的配置项都要添加对应的命令行参数,不太方便。

Go生态里有一个开源项目viper可以用于处理类似的问题,但是项目比较大,和pflagcobra的耦合也比较深。

其实我需要的功能很简单,一个类似Java -Dserver.port=8000中的-D这样的选项,让我可以动态的修改配置文件中的一些配置项。这样,不管配置来自哪里,里面有哪些字段,我都可以通过-Da.b.c=1这样的方式来修改。

ChatGPT辅助开发

按照我的这个痛点,我准备开发一个库,这个库的工作很简单,就是可以使用一定的语法,获取和设置任意对象中的属性。

比如,下面这个YAML对应的对象(这实际上是一个docker-compose.yml的配置文件):

version: "2.0"
services:web:image: openjdk:8-jreports:- "8080:8080"- "8081:8081"

我要将web容器的镜像由openjdk:8-jre换成openjdk:8-jdk,可以编写这样的语句:services.web.image=openjdk:8-jdk;如果我想将8080端口修改成9090,则可以编写这样的语句:services.web.ports[0]=9090:8080

这并不是一个非常困难的项目,但作为一个尊贵的ChatGPT Plus会员,我想让GPT4辅助我完成这个项目代码的编写。

首先,我们需要将自己的需求清晰地描述给ChatGPT,比如,我将我的需求抽象成一个名为SetAttr的函数,并将这个函数的作用和例子发给它:

5ff260e625086e21d68c0b7fac6833b9.png

ChatGPT返回给我的函数,看起来大致没有什么问题。接着,我还让其帮忙生成了与SetAttr对应的GetAttr函数,由于前面已经生成过SetAttr,所以对于GetAttr函数的描述可以比较简单,GPT4具有一定逻辑思考能力:

fa506bb5ddf2fe57b16572d542f81487.png

这两个函数的代码主体上没有什么问题,但细节是否能完全满足我们的需求,还需要编写单元测试来验证。

我这里的建议是,如果代码由GPT生成,那么单元测试需要我们人工来编写;如果代码是我们人工编写,那么单元测试可以让GPT生成。人工编写的过程中,可以让GPT来生成一些辅助片段加快我们工作效率,但最好不要把这两部分全部都交给GPT来实现,否则很可能在它那里是逻辑自洽的,但实际上有很多情况没有被考虑,需要大量修改。

最后,我投入了一些时间在单元测试的编写上,处理了一些panic,让项目可以适应大部分情况。

项目取名与开源

完成了代码开发,我们可以让ChatGPT帮忙生成一下README:

483db3e2bd4725f597da9993cc334cbc.png

这就是我第一个使用ChatGPT辅助生成的完整项目。ChatGPT的工作大概70%,我的工作大概30%,相比于正常实现一个类似的项目,我大概节省了50%时间。

我的贡献除了编写部分单元测试,我还优化了API,让其更方便被使用,用可以直接通过这样的方式来设置config对象的任意属性:

goattribute.New(&config).SetAttr("Services.Web.Ports[0]", "9090:8080")

有这样一个库,我就可以比较方便地实现文章开头的需求了——从命令行获取-D参数的值后,使用=将其分割成键名和值,键名作为SetAttr的第一个参数,值作为SetAttr的第二个参数即可。

完整代码已经发布在https://github.com/phith0n/goattribute,如果你与我有相似需求,可以考虑使用这个库来优化你的配置管理流程。当然,goattribute并不仅限于我上面说到的场景,也可以用于操纵任意对象的值。

1b445d9c9667437d48308060b1c00427.gif

封面图片由MidJourney生成。喜欢这篇文章,点个在看再走吧~

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

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

相关文章

阿里自爆性能优化100+小技巧,Github已获赞68.7K

随着互联网飞速的发展,从4G到5G的全面过渡,深度学习性能优化,已经变成一个越来越重要的话题,从面试时的面试题都可以看出来了,所以今天就来分享一份Java性能优化100小技巧! 本性能优化手册包含内容&#x…

在虚拟机上测试rm -rf 命令,自爆了

切记不要在任何正常机器上使用rm -rf / 或 rm -rf / * 命令!!! 系统:CentOS-7-x86_64-DVD-2003.iso 开始测试: 现在很多操作系统,已经默认拒绝在 / 目录下执行递归删除操作了,这减小了一些风险。…

【UE】三步创建自动追踪自爆可造成伤害的敌人

效果 可以看到造成伤害时在右上角打印玩家当前的生命值 步骤 1. 首先拖入导航网格体边界体积 2. 首先复制一份“ThirdPersonCharacter”,命名为“ExplodingAI” 打开“ExplodingAI”,删除事件图表中所有节点 添加一个panw感应组件 在事件图表中添加如…

字节跳动技术总监自爆:mysql创建库books

算法 ⼏道常⻅的字符串算法题总结最⻓公共前缀回⽂串两数相加翻转链表链表中倒数第k个节点删除链表的倒数第N个节点合并两个排序的链表剑指offer部分编程题跳台阶问题变态跳台阶问题⼆维数组查找替换空格题⽬描述:数值的整数次⽅调整数组顺序使奇数位于偶数前⾯链表…

字节跳动技术总监自爆:mongodbmysql配合使用

算法 ⼏道常⻅的字符串算法题总结最⻓公共前缀回⽂串两数相加翻转链表链表中倒数第k个节点删除链表的倒数第N个节点合并两个排序的链表剑指offer部分编程题跳台阶问题变态跳台阶问题⼆维数组查找替换空格题⽬描述:数值的整数次⽅调整数组顺序使奇数位于偶数前⾯链表…

字节跳动技术总监自爆:微服务架构技术栈

一、对Kafka的认识 1.Kafka的基本概念 2.安装与配置 3.生产与消费 4.服务端参数配置 二、生产者 1.客户端开发 2.原理分析 3.重要的生产者参数 三、消费者 1.消费者与消费组

字节跳动技术总监自爆:大学javaweb课程

一、前言 最近刚读完一本书:《Netty、Zookeeper、Redis 并发实战》,个人觉得 Netty 部分是写得很不错的,读完之后又对 Netty 进行了一波很好的复习(之前用 spring boot netty zookeeper 模仿 dubbo 做 rpc 框架,那时…

惊艳,阿里自爆用480页讲清楚了44种微服务架构设计模式

微服务架构设计 微服务的概念虽然直观易懂,但“细节是魔鬼”,微服务在实操落地的环节中存在诸多挑战。微服务也是可以成为企业转型的强力催化剂! 随着网络基础设施的高速发展,以及越来越多的企业和组织需要通过互联网提供服务&a…

Pytorch 深度学习实战教程(六):仝卓自爆,快本打码。

本文 GitHub https://github.com/Jack-Cherish/PythonPark 已收录,有技术干货文章,整理的学习资料,一线大厂面试经验分享等,欢迎 Star 和 完善。 一、人脸识别 人脸识别是一门比较成熟的技术。 它的身影随处可见,刷脸…

阿里自爆十万字Java面试手抄本

金九银十就要来了,近两年企业越来越不好做,导致面试时对程序员的要求越来越高,越来越挑剔,除了掌握扎实的专业技能之外,你还需要一份Java程序员面试题汇总,才能在万千面试者中杀出重围,成功拿下…

玻璃绝缘子自爆图像数据集(3k多张,无标签)

下载地址: 玻璃绝缘子自爆图像数据集(3k多张,无标签)

2-9自报家底相关函数以及应用

1.自报家底 我们本篇文章,将讨论什么是自报家底,相关的函数又有哪些,它的基本使用是怎么样的,为什么自爆家底能够把所有能暴露的都暴露出来,它的原理是什么,我们又如何把用户名、数据库名,甚至…

【虚幻引擎】UE4/UE5科大讯飞文字合成语音

一、链接地址 链接:https://pan.baidu.com/s/15Qoc48x3DLpw4eW1qHXInQ 提取码:jqpx B站视频链接:https://space.bilibili.com/449549424?spm_id_from333.1007.0.0 二、案例介绍 第一步:首先进入讯飞开放平台注册一个账号&…

虚幻引擎C++开发学习(三)

这一章,我们要实现一个俯视视角的坦克小游戏,玩家可以操作坦克在地图中移动。敌人是固定的,但是具备一定的AI,可以瞄准玩家,并且在玩家进入攻击范围后,对玩家进行攻击。如果玩家被摧毁,则游戏结…

在虚幻引擎中创建大气的HIMIL电影作品

今天瑞云渲染小编给大家带来了关于电影制片人Tiziano Fioriti展示了《H I M I L》项目背后的工作流程,解释了人工智能是如何用于细节的,并谈到了设置火光的问题。 介绍 大家好,我叫Tiziano Fioriti,是来自意大利的自由电影制作人…

颠覆游戏开发,虚幻引擎 UE5 正式发布

整理 | 章雨铭 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 4月6日,UE5正式发布! 体验完UE5的新功能后,3D游戏狂热爱好者感叹:“惊呆了,老铁!”美工直呼:”工作量…

虚幻4引擎将至!从虚幻看游戏引擎发展

3D游戏引擎是个什么玩意 泡泡网显卡频道5月23日 在某游戏中的一个场景中,玩家控制的角色躲藏在屋子里,敌人正在屋子外面搜索玩家。突然,玩家控制的是一个穿迷彩服的士兵,突然碰倒了桌子上的一个杯子,杯子坠地发出破碎…

UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明

目录 CreateMqttClient Connect Subscribe UnSubscribe Publish Disconnect BindConnectedDelegate BindConnectionLostDelegate BindMessageDelegate CreateMqttClient 创建一个Mqtt客户端对象 Connect 链接Mqtt服务器Subscribe 订阅消息频道UnSubscribe 取消订阅频道…

Unreal Engine 虚幻引擎 接入第三方SDK

前言 虚幻引擎对SDK接入有着一套专门的方式,本文主要描述了如何给使用虚幻引擎开发的项目接入第三方SDK,并分享了接入微信SDK的分享等基础功能的实践过程,还涉及到调试和提高整合SDK效率的一些方法。 SDK意义 SDK 广义是指Software Development Kit 即 应…

虚幻引擎UE4中的Tick事件

虚幻引擎UE4中的Tick事件是程序运行中每一帧刷新一次,例如在通常每秒60帧的游戏运行中,Tick事件就每秒执行了60次。这个事件相当于Unity中的Update和LateUpdate函数一样的性质,(同理在JS中就是animate()函数)。 在UE4里…