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生成模板工具链的资料请关注脚本之家其它相关文章!

相关文章

  • golang 实现菜单树的生成方式

    golang 实现菜单树的生成方式

    这篇文章主要介绍了golang 实现菜单树的生成方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang语言JSON解码函数Unmarshal的使用

    Golang语言JSON解码函数Unmarshal的使用

    本文主要介绍了Golang语言JSON解码函数Unmarshal的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Golang标准库和外部库的性能比较

    Golang标准库和外部库的性能比较

    这篇文章主要介绍Golang标准库和外部库的性能比较,下面文章讲围绕这两点展开内容,感兴趣的小伙伴可以参考一下
    2021-10-10
  • 详解Golang函数式选项(Functional Options)模式

    详解Golang函数式选项(Functional Options)模式

    什么是函数式选项模式,为什么要这么写,这个编程模式解决了什么问题呢?其实就是为了解决动态灵活的配置不同的参数的问题。下面通过本文给大家介绍Golang函数式选项(Functional Options)模式的问题,感兴趣的朋友一起看看吧
    2021-12-12
  • Go可变参数函数的实现

    Go可变参数函数的实现

    可变参数函数是指函数参数的某个参数可有可无,即这个参数的个数可以为0会多个,可变参数函数参数在日常编程中大量使用,本文主要介绍了Go可变参数函数的实现,感兴趣的可以了解一下
    2023-12-12
  • Go官方工具链用法详解

    Go官方工具链用法详解

    Go官方工具链工具要求所有的Go源代码文件必须以.go后缀结尾。这里,我们假设一个最简单的Go程序放在hello.go的文件中,下面通过示例代码给大家介绍Go官方工具链用法简介,需要的朋友可以参考下
    2021-10-10
  • Go使用XORM操作MySQL的陷阱盘点分析

    Go使用XORM操作MySQL的陷阱盘点分析

    在 Go 语言开发中,大家为了方便,通常会选择使用 ORM 操作数据库,比如使用 XORM 或 GORM 操作 MySQL,本文我们来介绍一下使用 XORM[3] 操作 MySQL 可能会遇到的陷阱
    2023-11-11
  • Golang切片Slice功能操作详情

    Golang切片Slice功能操作详情

    这篇文章主要介绍了Golang切片功能操作详情,切片是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封,切片是一个引用类型,它的内部结构包含地址、长度和容量
    2022-09-09
  • Go routine调度详解

    Go routine调度详解

    这篇文章主要介绍了Go routine调度详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • GO语言(golang)基础知识

    GO语言(golang)基础知识

    这篇文章主要介绍了GO语言(golang)基础知识,需要的朋友可以参考下
    2015-01-01

最新评论