go新工具gonew生成模板工具链使用详解

 更新时间:2023年08月10日 14:24:50   作者:煎鱼  
这篇文章主要为大家介绍了go新工具gonew生成模板工具链使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

不知道大家平时在日常工作中,会不会遇到一个问题?公司用着微服务架构,经常要创建新的服务,需要一个应用模板去初始化新的服务,减少 ctrl+c+v,转为相对自动化。

不同团队根据 Leader 的喜好、要求不同,应用模板又会不同。有的喜欢 DDD、有的喜欢 MVC、有的大道至简即可。每家公司都会延伸出一个工具链做这个事情。

新工具:gonew 生成模板

在 Go 社区也出现了这种诉求,Go 核心团队带头大哥 @Russ Cox 发起了一个新讨论《gonew: templates for new modules》,引发了各方的热议:

原因是:Go 团队经常收到用户反馈要求使用某种 "go new" 功能,以某种基本模板启动一个新的模块(项目)。

这个工具不局限于 Go 团队提供的模板,任何人都可以定义这个模板。这个模板也是很 “普通”,没什么特殊的功能。

"go new" 的核心工作是下载一个模板,更改其模块路径,然后把它放到一个新的目录中进行编辑。当然这个工具链未来可能还有更多的功能,但这就是最核心的诉求。

也出现了一个新的场景。有一名图书作者,希望能够更方便的提供图书示例,不想要图书读者费尽心思克隆一个 git 仓库。答案显而易见,那就是本文提到的 gonew 工具。

快速体验和实操

结合前后事迹来看,@Russ Cox 是一个执行效率比较高的人。提出讨论的前几个月,已经写好了工具给大家试用了。

安装命令如下:

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

创建命令如下:

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

执行完毕后,会在当前目录下,创建一个 hello 目录(./hello)。模板的结构如下:

$ tree hello 
hello
├── LICENSE
├── go.mod
├── hello.go
└── reverse
    ├── example_test.go
    ├── reverse.go
    └── reverse_test.go

1 directory, 6 files

我对比了一下,和模板基准的 git 仓库 github.com/golang/example 的相关代码是一致的。

可能会有同学说,不行啊。我还要改 module path。这点在现在也是已经支持的了。

如下命令:

$ gonew github.com/ServiceWeaver/template example.com/foo
gonew: initialized example.com/foo in ./foo

生成目录:

$ tree foo
foo
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── main.go
├── weaver.toml
└── weaver_gen.go

对应生成的目录名是指定的 foo,创建出来的 go.mod 文件的 module path 是:module example.com/foo

符合上面提的要求。

一些讨论

结合讨论的内容来看,大家的反馈都是比较积极支持的。因为确实看到社区里很多人为此做了一模一样的事情,各语言都有,真的是各显神通了。

有个别同学支持将本文提到的 go new 放到 go mod init 中,这样就不需要再单独创造一个新的命令集。

提出的同学认为 go mod init 本质上也是在引导 Go 应用的使用,和 go new 比较类似。可以调整为:

go mod init example.com/x/abc --template github.com/ServiceWeaver/template

以此满足一样的诉求。

不过我感觉这命令就太长了,没 go new 那么短小精悍。

总结

本次 go new 工具的讨论和实验,Go 团队非常迅速。目测势在必得,肯定会加进去了。

因为根据反馈 Google 的几个团队也有兴趣尝试使用 gonew 进行模板化。ServiceWeaver 团队对此也非常感兴趣。

功能虽然非常简单,但基本满足了不同的团队为了不同的代码模板,创建一个新的模板的诉求。一旦成熟,也就不需要人均手搓一个模板的脚手架工具了。

后续各自在工具链套一下就 OK,一个快速的小成果就好了

以上就是go新工具gonew生成模板工具链使用的详细内容,更多关于go gonew生成模板工具链的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言之结构体与方法

    Go语言之结构体与方法

    这篇文章主要介绍了Go语言之结构体与方法,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。下面我们就一起来学习什么是Go语言之结构体
    2021-10-10
  • go并发利器sync.Once使用示例详解

    go并发利器sync.Once使用示例详解

    这篇文章主要为大家介绍了go并发利器sync.Once使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 详解Go语言的内存模型及堆的分配管理

    详解Go语言的内存模型及堆的分配管理

    这篇笔记主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收,文中有详细的代码示例以及图片介绍,需要的朋友可以参考下
    2023-05-05
  • golang gorm的Callbacks事务回滚对象操作示例

    golang gorm的Callbacks事务回滚对象操作示例

    这篇文章主要为大家介绍了golang gorm的Callbacks事务回滚对象操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • GoLang抽奖系统简易实现流程

    GoLang抽奖系统简易实现流程

    这篇文章主要介绍了GoLang抽奖系统实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • golang下的viper包的简单使用方式

    golang下的viper包的简单使用方式

    这篇文章主要介绍了golang下的viper包的简单使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 初探Golang数据结构之Slice的使用

    初探Golang数据结构之Slice的使用

    在学习Go语言时,一直对数组和切片的使用场景好奇,不明白为什么推荐使用切片来代替数组,所以本文就来和大家梳理一下Slice切片的相关知识吧
    2023-09-09
  • 详解Go语言的context包从放弃到入门

    详解Go语言的context包从放弃到入门

    这篇文章主要介绍了Go语言的context包从放弃到入门,本文通过实例演示给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • GO 语言运行环境的基础知识

    GO 语言运行环境的基础知识

    这篇文章主要介绍了GO 语言运行环境的基础知识的相关资料,需要的朋友可以参考下
    2022-09-09
  • 利用Go Plugin实现插件化编程的简单方法

    利用Go Plugin实现插件化编程的简单方法

    Golang官方提供了plugin模块,该模块可以支持插件开,下面这篇文章主要给大家介绍了关于如何利用Go Plugin实现插件化编程的相关资料,需要的朋友可以参考下
    2021-10-10

最新评论