【Go语言成长之路】多模块工作区入门

2024-08-27 07:44

本文主要是介绍【Go语言成长之路】多模块工作区入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 【Go语言成长之路】多模块工作区入门
    • 前提条件
    • 一、创建一个模块
    • 二、创建工作空间
    • 三、创建第二个模块
    • 四、更多关于workspace

【Go语言成长之路】多模块工作区入门

​ 多模块工作区(muti-module workspaces)可以使得开发者在多个模块中构建并且运行代码,相互独立,互不干扰。

​ 本教程中,将会创建两个模块来共享一个多模块工作区,并且跨模块进行更改,在构建中查看这些更改的结果。

前提条件

  • Go1.18以及之后的版本

  • 命令终端。 Go 可以在 Linux 和 Mac 上的任何终端以及 Windows 中的 PowerShell 或 cmd 上正常运行

  • 一个编辑代码的工具(文本编辑器)

一、创建一个模块

  1. 创建工作目录

    创建一个新的工作空间,名称为workspace

    ~$ mkdir workspace
    ~/workspace$ cd workspace
    
  2. 初始化模块

    创建一个新的模块,名称为hello

    ~/workspace$ mkdir hello
    ~/workspace$ cd hello
    ~/workspace/hello$ go mod init example.com/hello
    go: creating new go.mod: module example.com/hello
    

    在 hello 目录下创建 hello.go,内容如下:

    package mainimport ("fmt""golang.org/x/example/hello/reverse"
    )func main() {fmt.Println(reverse.String("Hello"))
    }
    

    可以看到,在代码中,我们有着一个依赖外部包,因此需要使用go get添加对golang.org/x/example/hello/reverse包的依赖:

    ~/workspace/hello$ go get golang.org/x/example/hello/reverse
    go: downloading golang.org/x/example v0.0.0-20240716161537-39e772fc2670
    go: downloading golang.org/x/example/hello v0.0.0-20240716161537-39e772fc2670
    go: added golang.org/x/example/hello v0.0.0-20240716161537-39e772fc2670
    

    最后,运行hello程序

    ~/workspace/hello$ go run hello.go 
    olleH
    

二、创建工作空间

在此步骤中,我们将创建一个 go.work 文件来指定模块的工作区。

  1. 初始化工作空间

    ~/workspace$ go work init ./hello/
    ~/workspace$ cat go.work 
    go 1.23.0 # go 指令告诉 Go 应使用哪个版本的 Go 来解释该文件use ./hello # use 指令告诉 Go 在构建时 hello 目录中的模块应该是主模块。因此,在工作区的任何子目录中,该模块都将处于活动状态。
    

    go work init 命令告诉 go 为包含 ./hello 目录中的模块的工作空间创建一个 go.work 文件。

  2. 运行工作空间目录下的程序

    $ go run ./hello
    olleH
    

    在模块或工作区之外运行 go run 命令会导致错误, 但是在工作区内运行则可以通过。

三、创建第二个模块

  1. 创建模块

    ~/workspace$ mkdir second
    ~/workspace/second$ touch second.go
    package secondimport ("fmt"
    )func Hello() {fmt.Println("second")
    }~/workspace/second$ go mod init example.com/second
    ~/workspace/second$ go mod tidy
    
  2. 将模块添加到工作区

    second模块位于./second内,将其添加到工作区:

    ~/workspace$ go work use second
    

    通过使用go work use命令就成功地将一个新模块添加到工作区内了,添加后的go.work内容如下所示:

    ~/workspace$ cat go.work 
    go 1.23.0use (./hello./second
    )
    
  3. 修改 hello 程序以使用该函数

    package mainimport ("fmt""github.com/pzs/second""golang.org/x/example/hello/reverse"
    )func main() {fmt.Println(reverse.String("Hello"))second.Hello()
    }
    
  4. 添加replace以引用本地包

    修改hello包下的go.mod文件:

    replace github.com/pzs/second => ../second
    

    之后运行go mod tidy命令:

    ~/workspace/hello$ go mod tidy
    go: found github.com/pzs/second in github.com/pzs/second v0.0.0-00010101000000-000000000000
    

    注:若引用的不是本地包,而是外部下载到本地的包修改后引用的话,则可以不使用replace,直接引用即可。默认会直接应用本地的包,而不是外部包。关于具体的例子,可以参考官方的文档: https://go.dev/doc/tutorial/workspaces

  5. 在工作空间中运行代码

    ~/workspace$ go run ./hello/
    olleH
    second
    

    Go命令在go.work文件指定的hello目录中查找命令行指定的example.com/hello模块。

    注:由于这两个模块位于同一工作区中,因此可以轻松地在一个模块中进行更改并在另一个模块中使用它。

四、更多关于workspace

go work的子命令:

  • go work use [-r] [dir]: 将 use 指令添加到 dir 的 go.work 文件中(如果存在),如果参数目录不存在,则删除 use 目录。 -r 标志递归地检查 dir 的子目录。
  • go work edit: 编辑 go.work 文件,类似于 go mod edit
  • go work sync 将工作区构建列表中的依赖项同步到每个工作区模块中。

有关工作区和 go.work 文件的更多详细信息,请参阅 Go 模块参考中的Workspaces 。

这篇关于【Go语言成长之路】多模块工作区入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111054

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下