Go1.18新特性让多模块开发变得更简单!-《GO开发知识笔记》

admin 2025-11-04 01:12:36 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 查看 go 版本

    引言关于泛型网上已经有很多介绍的教程了,这里我介绍一个实用的功能,多模块工作区的使用方法和教程。Go多模块工作区能够使开发者能够更容易地同时处理多个模块的工作,如:方便进行依赖的代码调试(打断点、修改代码)、排查依赖代码bug。方便同时进行多个仓库/模块并行开发调试。一、多模块工作区(一)说明go使用的是多模块工作区,可以让开发者更容易同时处理多个模块的开发。在Go 1.17之前,只能使用go.mod replace指令来实现,如果你正巧是同时进行多个模块的开发,使用它可能是很痛苦的。每次当你想要提交代码的时候,都不得不删除掉go.mod中的replace才能使模块稳定的发布版本。在使用go 1.18多模块工作区功能的时候,就使用这项工作变得简单容易处理。下面我来介绍怎么使用这一功能。Go多模块工作区文档、代码示例获取地址:https://github.com/link1st/link1st/tree/master/workspaces

    (二)使用条件首先 我们需要go 1.18或更高版本go安装https://go.dev/doc/install

    查看 go 版本

    1. # 查看 go 版本
    2. > go version
    3. go version go1.18 darwin/amd64

    (三)go work支持命令go work通常情况下,建议不要提交go.work文件到git上,因为它主要用于本地代码开发。推荐在: $GOPATH路径下执行,生成go.work文件go work init初始化工作区文件,用于生成go.work工作区文件初始化并写入一个新的go.work到当前路径下,可以指定需要添加的代码模块。示例: go work init./hello将本地仓库hello添加到工作区,hello仓库必须是go mod依赖管理的仓库(./hello/go.mod文件必须存在)go work use添加新的模块到工作区命令示例:go work use./example添加一个模块到工作区。go work use./example./example1添加多个模块到工作区。go work use-r./example递归./example目录到当前工作区。删除命令使用go work edit-dropuse=./example功能。go work edit用于编辑go.work文件可以使用edit命令编辑和手动编辑go.work文件效果是相同的。示例:go work edit-fmt go.work重新格式化go.work文件。go work edit-replace=github.com/link1st/example=./example go.work替换代码模块。go work edit-dropreplace=github.com/link1st/example删除替换代码模块。go work edit-use=./example go.work添加新的模块到工作区。go work edit-dropuse=./example go.work从工作区中删除模块。go work sync将工作区的构建列表同步到工作区的模块。go env GOWORK查看环境变量,查看当前工作区文件路径。可以排查工作区文件是否设置正确,go.work路径找不到可以使用GOWORK指定。

    1. > go env GOWORK
    2. $GOPATH/src/link1st/link1st/workspaces/go.work

    go.work文件结构文件结构和go.mod文件结构类似,支持Go版本号、指定工作区和需要替换的仓库。文件结构示例:

    1. go 1.18
    2. use (
    3. ./hello
    4. ./example
    5. )
    6. replace (
    7. github.com/link1st/example => ./example1
    8. )

    use指定使用的模块目录可以使用go work use hello添加模块,也可以手动修改go.work工作区添加新的模块。在工作区中添加了模块路径,编译的时候会自动使用use中的本地代码进行代码编译,和replaces功能类似。

    1. # 单模块结构
    2. use ./hello
    3. # 多模块结构
    4. use (
    5. ./hello
    6. ./example
    7. )

    replaces替换依赖仓库地址replaces命令与go.mod指令相同,用于替换项目中依赖的仓库地址。需要注意的是replaces和use不能同时指定相同的本地路径。同时指定报错信息:go: workspace module github.com/link1st/example is replaced at all versions in the go.work file. To fix, remove the replacement from the go.work file or specify the version at which to replace the module.错误示例:同时在use和replace指定相同的本地路径。

    1. go 1.18
    2. use (
    3. ./hello
    4. ./example
    5. )
    6. replace (
    7. github.com/link1st/example => ./example
    8. )

    go.work文件优先级高于go.mod中定义在同时使用go.work和go.mod replace功能的的时候分别指定不同的代码仓库路径,go.work优先级高于go.mod中定义。go.mod中定义替换为本地仓库example

    1. replace (
    2. github.com/link1st/example => ./example1
    3. )

    go.work中定义替换为本地仓库example1

    1. replace (
    2. github.com/link1st/example => ./example1
    3. )

    在代码构建时候使用的是go.work指定的example1仓库的代码,go.work优先级别更高。(四)如何使用在Go 1.18 go run和go build都会默认使用工作区功能GOWORK也可以指定配置go.work文件位置<br />export GOWORK="~/go/src/test/go.18/workspace/go.work"(五)如何禁用工作区Go全局变量GOWORK设置off则可以禁用工作区功能export GOWORK=off二、开发流程演示演示如何使用多模块工作区功能。在现在微服务盛行的年代,一个人会维护多个代码仓库,很多的时候是多个仓库进行同时开发。假设我们现在进行hello仓库开发,实现的功能是,实现将输入的字符串反转并输出,字符串反转功能依赖于github.com/link1st/example (下文统称example)公共仓库实现。新建hello项目。

    1. mkdir hello
    2. cd hello
    3. # 代码仓库启动 go mod 依赖管理,生成 go.mod 文件
    4. go mod init github.com/link1st/link1st/workspaces/hello
    5. # 下载依赖包
    6. go get github.com/link1st/example
    7. # 编写 main 文件
    8. vim main.go

    main.go代码

    1. // Package main main 文件,go 多模块工作区演示代码
    2. // 实现将输入的字符串反转输出并输出
    3. package main
    4. import (
    5. "flag"
    6. "fmt"
    7. "github.com/link1st/example/stringutil"
    8. )
    9. var (
    10. str = ""
    11. )
    12. func init() {
    13. flag.StringVar(&str, "str", str, "输入字符")
    14. flag.Parse()
    15. }
    16. func main() {
    17. if str == "" {
    18. fmt.Println("示例: go run main.go -str hello")
    19. fmt.Println("str 参数必填")
    20. flag.Usage()
    21. return
    22. }
    23. // 调用公共仓库,进行字符串反转
    24. str = stringutil.Reversal(str)
    25. // 输出反转后的字符串
    26. fmt.Println(str)
    27. return
    28. }

    运行代码go run main.go-str“hello world”或go run github.com/link1st/link1st/workspaces/hello-str“hello world”可以看到输出了hello world反转以后的字符串。

    1. > go run main.go -str "hello world"
    2. dlrow olleh

    到这里,最初的功能已经完成,但是后续需求变动,不仅需要输出反转以后的字符串,还需要将字符串大写。我们则需要去example仓库中添加开发 将字符串大写的功能

    1. # 回到工作根目录,将 common 代码下载到本地进行添加新的功能
    2. # 下载依赖的 example 包
    3. git clone [email protected]:link1st/example.git
    4. # 在 example 包中添加 字符串大学的功能

    vim example/stringutil/to_upper.go代码如下:

    1. // Package stringutil stringutil
    2. package stringutil
    3. import (
    4. "unicode"
    5. )
    6. // ToUpper 将字符串进行大写
    7. func ToUpper(s string) string {
    8. r := []rune(s)
    9. for i := range r {
    10. r[i] = unicode.ToUpper(r[i])
    11. }
    12. return string(r)
    13. }

    由于代码还在本地调试,未提交git仓库中,这个时候就需要用到Go多模块工作区的功能了。进入项目根目录,初始化我们现在正在开发的模块。

    1. # 初始化 go.work 文件
    2. go work init ./hello ./example
    3. # 查看 go.work 文件内容
    4. cat go.work

    文件结构如下:

    1. go 1.18
    2. use (
    3. ./example
    4. ./hello
    5. )

    回到hello项目,vim main.go将字符串大写的功能添加上。

    1. func main() {
    2. ...
    3. // 调用公共仓库,进行字符串反转
    4. str = stringutil.Reversal(str)
    5. // 增加字符大写的功能
    6. str = stringutil.ToUpper(str)
    7. // 输出反转后的字符串
    8. fmt.Println(str)
    9. ...
    10. }

    运行代码可以看到输出了反转并大写的字符串,大写的函数功能只在本地,未提交到git上,这样我们就实现了可以同时在两个模块上并行开发。

    1. go run main.go -str "hello world"
    2. DLROW OLLEH

    总结使用Go多模块工作区的功能,可以让我们轻松在多个模块之间切换工作,更能适应现代微服务架构开发。参考资料:1.Go 1.18 新特性多模块工作区教程2.Go 1.18 is released3.Tutorial: Getting started with multi-module workspaces4.go-1.18-features

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  8