Go项目初始化不再困扰你:gonew全方位解析

news2024/10/7 10:21:05

近日,Go官博介绍了一个名为gonew的新工具[1]。该工具支持基于go project template clone并创建一个属于你的Go项目。gonew工具的引入大幅简化了Go项目的创建,同时由于对自定义项目模板的支持,也可以提高Go项目的标准化水平。gonew工具刚刚被放入Go工具项目代码仓库[2],目前还处于实验阶段,后续可能会增加新特性,但当前的核心特性(core functionality)会持续保留。

本文将针对gonew目前的特性做简要说明,以供大家参考。

1. 起源

Go team为何要引入gonew这个工具呢?按照Russ Cox的说法[3],Go team经常收到一些Go用户关于使用某种"go new"功能的要求,即以某种基本的项目模板来创建一个新Go module。于是Russ Cox私下里编写了一个实现了这类核心功能特性的小工具:rsc.io/tmp/gonew。该工具的逻辑非常简单,主要就是下载一个模板module,更改其module path,并将其放到本地的一个新目录中。Russ在google内部宣传该工具后,Google内部的一些团队便定制了一些模板(template),尤其是ServiceWeaver团队的响应尤为积极。这一切最终让Russ决定引入golang.org/x/tools/cmd/gonew[4]

我们接下来看看gonew究竟长什么样子,能做什么!

2. 安装和使用gonew

2.1 安装gonew

我们执行下面命令便可以相当容易的将gonew安装到本地(如果设置了GOPATH,那么该工具会安装到GOPATH/bin下):

$go install golang.org/x/tools/cmd/gonew@latest
go: downloading golang.org/x/tools v0.12.0
go: downloading golang.org/x/mod v0.12.0

执行一下gonew:

$gonew
usage: gonew srcmod[@version] [dstmod [dir]]
See https://pkg.go.dev/golang.org/x/tools/cmd/gonew.

2.2 使用gonew创建新项目

下面是用gonew创建新项目的两个典型场景:

  • 基于模板创建“同名module”项目

以golang.org/x/example/helloserver模板为例,我们基于该模板通过gonew创建一个新项目:

$gonew golang.org/x/example/helloserver
gonew: initialized golang.org/x/example/helloserver in ./helloserver

探索一下该项目:

$ cd helloserver/
$ ls
LICENSE  go.mod  server.go
$ git status
fatal: Not a git repository (or any of the parent directories): .git
$ cat go.mod
module golang.org/x/example/helloserver

go 1.19

我们发现gonew仅是将helloserver模板项目下载到本地(显然不会包含原模板项目的git仓库目录(.git)),且go module的名字也未被改变。

很多人会问:这样的gonew用法用在什么场景中呢?Russ Cox给出了应用场景:

$ gonew book.com/mybook-examples

这个用法适用于在本地创建某图书作者的样例代码项目。

  • 基于模板创建新module项目

这里我们基于helloserver项目模板创建我们自己的github.com/bigwhite/myhelloserver module项目:

$ gonew golang.org/x/example/helloserver github.com/bigwhite/myhelloserver
gonew: initialized github.com/bigwhite/myhelloserver in ./myhelloserver

同样探索一下新创建的项目:

$ cd myhelloserver/
$ ls
LICENSE  go.mod  server.go
$ cat go.mod
module github.com/bigwhite/myhelloserver

go 1.19

我们看到:和第一种用法不同的是,这次go.mod中的module path被改为我们期望的module path。

这种用法应该是gonew最常用的场景。

根据gonew的命令说明,它还支持基于模板项目的特定版本来创建新项目,并支持指定本地存放新项目的路径,这里就不演示了。

3. gonew的项目模板

gonew中提到的项目模板并不神秘,它就是一个go module,这个module具有一些脚手架代码,其存在的目的就是被复用。

google提供了一些模板示例,比如:go team的hello[5]、hellserver[6]和outyet[7];ServiceWeaver提供的template[8]等。

在gonew出现前,可能很多组织就是这么做的,会定义一些Go脚手架项目作为模板,供大家创建go新项目时参考。Go社区也有很多相似gonew的开源工具,在gonew的讨论帖[9]中,很多人晒了自己的类gonew项目。

有了gonew以后,建立组织级Go项目模板库将会成为提升组织内go项目初始化效率的重要手段,这样做后,组织级go项目标准化程度会得到大幅提升。

4. gonew与Go项目标准布局

可能很多Gopher和我一样,在第一眼看到Go官博关于gonew的文章标题时,以为Go team终于官宣了Go项目的标准布局,并基于gonew工具来创建采用标准布局的新项目。可但我深入读下去后,发现并非如此。

gonew并没有规定Go项目标准布局。gonew是开放性,只要是合法的go module项目都可以作为template在创建新项目时使用。这体现了gonew工具的灵活性和可扩展性,至于将来go team是否会定义一系列的“标准布局”模板还是未知数。

关于Go项目标准布局的思考,请参考我的极客时间专栏《Go语言第一课》[10]的第5讲“标准先行:Go项目的布局标准是什么?”。

5. 小结

gonew工具简化了Go项目初始创建的复杂度,并且基于一些符合Go最佳实践的项目模板,Go初学者可以分分钟得到符合Go最佳实践的目录布局的Go项目。公司和组织层面也可以通过定义专属Go模板来满足组织和公司的内部需要,提高go新项目的创建效率以及提升Go项目布局的标准化程度。新的Go项目的布局的标准化程度提高后,对组织内CI/CD流水线也会更加友好。

gonew的推出得到了社区的欢迎,社区也反馈gonew对快速启动项目很有帮助并提出了一些扩展建议。Russ Cox也说了:不排除在Go后续版本中将gonew升级为go new的可能性

让我们一起拭目以待吧!


“Gopher部落”知识星球[11]旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!2023年,Gopher部落将进一步聚焦于如何编写雅、地道、可读、可测试的Go代码,关注代码质量并深入理解Go核心技术,并继续加强与星友的互动。欢迎大家加入!

c632af77de8926333d095b770399107b.jpeg

7c0b525f70cf6f2f59a1a595eb99c540.png

b6236eef15617d74d4c2ce6c3da962ac.png

9278b30b9ae7d29c8193dcbe6d736b06.jpeg

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址[12]:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) - https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx

  • 微博2:https://weibo.com/u/6484441286

  • 博客:tonybai.com

  • github: https://github.com/bigwhite

  • Gopher Daily归档 - https://github.com/bigwhite/gopherdaily

  • 559ab2e28bdeb5004e11731ca673b453.png

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

参考资料

[1] 

Go官博介绍了一个名为gonew的新工具: https://go.dev/blog/gonew

[2] 

Go工具项目代码仓库: https://github.com/golang/tools/tree/master/cmd/gonew

[3] 

Russ Cox的说法: https://github.com/golang/go/discussions/61669#discussion-5459972

[4] 

golang.org/x/tools/cmd/gonew: https://github.com/golang/tools/tree/master/cmd/gonew

[5] 

hello: https://github.com/golang/example/tree/master/hello

[6] 

hellserver: https://github.com/golang/example/tree/master/helloserver

[7] 

outyet: https://github.com/golang/example/tree/master/outyet

[8] 

template: https://github.com/ServiceWeaver/template

[9] 

gonew的讨论帖: https://github.com/golang/go/discussions/61669

[10] 

极客时间专栏《Go语言第一课》: http://gk.link/a/10AVZ

[11] 

“Gopher部落”知识星球: https://public.zsxq.com/groups/51284458844544

[12] 

链接地址: https://m.do.co/c/bff6eed92687

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

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

相关文章

Java程序猿搬砖笔记(十六)

文章目录 狂神说-Elasticsearch 7.6入门学习笔记Windows Elasticsearch IK分词器插件启动报错Elasticsearch的ik分词器自定义字典myDict.dic的编码格式需要为UTF-8,否则无效Elasticsearch使用term查询无数据返回的原因Elasticsearch如果没给映射,字段默认使用standa…

k8s node 误删除了如何自动创建 csr重新加入集群

worker node 节点当部署晚 kubelet、kube-proxy就会加入集群,如何加入呢, [rootkube-node01 ssl]# mv kubelet-client-2023-08-13-01-19-00.pem kubelet-client-current.pem kubelet.crt kubelet.key /tmp/kubelet [rootkube-node01 ssl]# systemctl da…

使用LSH 进行特征提取

局部敏感哈希(LSH)通常用于近似最近邻算法(ANN) 操作(向量搜索)。LSH的特性也可以在以矢量为输入的神经网络模型中得到利用(例如,各种的音频、视频和文本嵌入等内容信号)。 通常情况下,特定领域模型中输入的流形是复杂的(非i. i. d&#xff…

免费AI学习文档(二)

国内绘画midjourney网站 http://aijiaolian.chat优质提示词分解教学 https://q3iylvv7qj.feishu.cn/docx/UGMzdPVGjo1fHcxu1kjcuXFcnff?fromfrom_copylink设计图AI实战,如何用AI提高83%的出图效率?https://q3iylvv7qj.feishu.cn/docx/Fsxxd3MncowFUix5…

Java SpringBoot 加载 yml 配置文件中字典项

实际项目中,如果将该类信息放配置文件中的话,一般会结合Nocas一起使用 将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如&#xff…

windows电脑简单实时tts语音播报wsay;python pyttsx3语言实时播报text-to-speech

1、wsay 参考: https://github.com/p-groarke/wsay 下载安装: https://github.com/p-groarke/wsay/releases/tag/v1.5.0 下载exe文件,并把加入环境变量就可 使用 # Say something. wsay "Hello there."wsay "你好"…

Node.js躬行记——接口管理

在页面发生线上问题时,你要做的事情就是去查接口,响应数据是否正确,查接口的方法有两种: 第一种是在浏览器中打开地址,但是你必须得知道详细的 URL,并且有些页面还需要附带参数。 第二种是打开编辑器&#…

赴日IT培训 你到底适不适合做赴日IT?

有很多正在学习或者已经从事IT行业的小伙伴,问自己到底适不适合做赴日程序员,问什么赴日IT这么褒贬不一,自己内心很纠结。今天小编就来从多个角度为大家分析一下,希望能对徘徊、犹豫的IT工程师们有所帮助。 为什么会有一部分人犹…

九、解析应用程序——分析应用程序(2)

文章目录 一、确定服务器端功能二、解析受攻击面 一、确定服务器端功能 通过留意应用程序向客户端披露的线索,通常可推断与服务器端功能和结构有关的大量信息,或者至少可做出有根据的猜测。以下面用于访问搜索功能的URL为例: 可见,.jsp文件扩…

R语言 列表中嵌套列名一致的多个数据框如何整合为一个数据框

在批量建模后容易得到list&#xff0c;list中的每个元素都是单个的tibble 或者 dataframe&#xff0c;如何将这些数据整合为一张表呢&#xff1f; 载入R包 library(broom) library(tidyverse) 模拟数据 models <- txhousing %>% group_by(city) %>% do(modlm(lo…

ICMP协议报文

1、CMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff09;是一种网络协议&#xff0c;它用于在IP网络中传递控制信息和错误消息。它通常与IP协议一起使用&#xff0c;IP协议负责发送和路由数据包&#xff0c;而ICMP协议负责检查网络是否可达、路由是否正…

多传感器融合相关技术

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 多传感器融合定位学习 深蓝-多传感器定位融合 深蓝学院 多传感器融合定位 作业 多传感器融合详解 二、相关介绍 1. 毫米波雷达&#xff08;Radar&a…

mysql数据库设计

一、表关系 二、表结构 1、树状结构图&#xff08;id0表示根节点&#xff0c;parent_id是父节点&#xff09; 2、价格&#xff08;decimal类型&#xff09; 3、订单时间对应每一个订单状态&#xff08;前端展示、方便排查问题、数据分析&#xff09; 4、订单表存储商品信息&a…

LeetCode.26,27,88三题-双指针的运用

本文将对3道解决方法类似的题目进行逐一分析&#xff0c;这三道题目分别是&#xff1a; LeetCode.26 删除有序数组中的重复项 LeetCode.27 移除元素 LeetCode.88 合并两个有序数组 1. LeetCode.27 移除元素&#xff1a; 题目内容如下&#xff1a; 假设一个数组为&#xff1…

uniapp+vue3+vite+pinia2.0.33项目初始化

目录 准备工作 注意事项 使用vue-cli创建项目 运行 准备工作 下载hbuild开发工具 HBuilderX-高效极客技巧 下载微信小程序开发工具 概览 | 微信开放文档 uniapp uni-app官网 注意事项 1.node.js版本>16#windows查看node版本 C:\Users\22862>node -v v18.16.0 …

02Mysql之多表查询--例题讲解

一、题目详情&#xff0c;以及表的建立 新增员工表emp和部门表deptcreate table dept (dept1 int ,dept_name varchar(11));create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);insert into dept values(101,财务),(102,销售)…

【数据中台商业化】数据中台微前端实践

一&#xff0c;需求背景 1 业务背景 在以往的业务场景中&#xff0c;用户进入五花八门的菜单体系中&#xff0c;往往会产生迷茫情绪&#xff0c;难以理解平台名称及具体作用&#xff0c;导致数据开发与管理学习成本较高&#xff0c;降低工作效率。为此我们整合从数据接入&…

不知道打仗之害,就不知道打仗之利

不知道打仗之害&#xff0c;就不知道打仗之利 【安志强趣讲《孙子兵法》第7讲】 【原文】 夫钝兵挫锐&#xff0c;屈力殚货&#xff0c;则诸侯乘其弊而起&#xff0c;虽有智者&#xff0c;不能善其后矣。 【注释】 屈力殚货&#xff1a;屈力&#xff0c;指力量消耗&#xff0c;…

掌握Python的X篇_32_使用python编辑pdf文件_pdfrw

本篇介绍利用python操作pdf文件&#xff0c;我们平时也会有合并和拆分pdf的需求&#xff0c;此时我们就可以使用本节内容。 文章目录 1. pdfrw的安装2. 切分pdf文件3. pdfrw官网及实现一版四面的实例 1. pdfrw的安装 pip install pdfrw官网地址&#xff1a;https://github.co…

设计模式之责任链模式【Java实现】

责任链&#xff08;Chain of Resposibility&#xff09; 模式 概念 责任链&#xff08;chain of Resposibility&#xff09; 模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者 通过前一对象记住其下一个对象的引用而连成一条…