在1.13版本中,Go的作者添加了一种管理Go项目所依赖库的新方法,称为Go modules。Go模块的添加是为了响应日益增长的需求,以使开发人员更容易维护其依赖项的各种版本,以及为开发人员在其计算机上组织项目的方式增加更多的灵活性。Go模块通常由一个项目或库组成,并包含一组Go包,然后一起发布。Go模块通过允许用户将他们的项目代码放在他们选择的目录中并为每个模块指定依赖项的版本,解决了原始系统GOPATH
的许多问题。
在本教程中,您将创建自己的公共Go模块并将包添加到您的新模块中。此外,你还可以将别人的public模块添加到自己的项目中,也可以将该模块的特定版本添加到自己的项目中。
要学习本教程,你需要:
安装了Go 1.16或更高版本。要设置它,请遵循针对您的操作系统的[如何安装Go]教程。
熟悉用Go编写包。要了解更多信息,请参考[如何在Go中编写包]教程。
乍一看,Go模块类似于[Go包]一个模块有许多实现包功能的Go代码文件,但它在根目录中还有两个额外的重要文件:go.mod
文件和go.sum
文件。这些文件包含go
工具用于跟踪模块配置的信息,并且通常由该工具维护,因此您不需要。
首先要做的是确定模块所在的目录。随着Go模块的引入,Go项目可以位于文件系统的任何位置,而不仅仅是Go定义的特定目录。你可能已经有了一个项目目录,但在本教程中,你将创建一个名为projects
的目录,新模块将被命名为mymodule
。你可以通过IDE或命令行创建projects
目录。
如果你使用的是命令行,首先创建projects
目录并导航到它:
mkdir projects
cd projects
接下来,创建模块目录本身。通常,模块的顶级目录名与模块名相同,这使事情更容易跟踪。在你的projects
目录下,运行以下命令来创建mymodule
目录:
mkdir mymodule
创建模块目录后,目录结构将如下所示:
└── projects
└── mymodule
下一步是在mymodule
目录中创建一个go.mod
文件来定义go模块本身。要做到这一点,你需要使用go
工具的mod init
命令并提供模块的名称,在本例中为mymodule
。现在,通过在mymodule
目录中运行go mod init
来创建该模块,并为其提供模块名称mymodule
:
go mod init mymodule
创建模块时,这个命令将返回以下输出:
Outputgo: creating new go.mod: module mymodule
创建模块后,你的目录结构现在看起来像这样:
└── projects
└── mymodule
└── go.mod
现在你已经创建了一个模块,让我们看看go.mod
文件内部的go mod init
命令做了什么。
go.mod
文件当您使用go
工具运行命令时,go.mod
文件是该过程中非常重要的一部分。这个文件包含模块的名称,以及你自己依赖的其他模块的版本。它还可以包含其他指令,例如replace
,这有助于一次在多个模块上进行开发。
在mymodule
目录中,使用nano
或你喜欢的文本编辑器打开go.mod
文件:
nano go.mod
内容看起来类似于下面这样,并不多:
projects/mymodule/go.mod
module mymodule
go 1.16
第一行module
指令告诉Go你的模块的名称,这样当它在包中查找import
路径时,它就知道不要在其他地方查找mymodule
。==mymodule==
值来自你传递给go mod init
的参数:
module mymodule
此时文件中唯一的另一行是go
指令,它告诉go模块的目标语言版本。在本例中,由于模块是使用Go 1.16创建的,因此go
指令为1.16
:
go 1.16
随着模块中添加更多信息,该文件将展开,但最好现在就查看它,看看随着进一步添加依赖项,它会如何变化。
您现在已经使用go mod init
创建了一个Go模块,并查看了初始的go.mod
文件包含什么,但您的模块还没有做任何事情。现在是时候进一步扩展你的模块并添加一些代码了。
为了确保正确创建模块并添加代码以便您可以运行第一个Go模块,您将在mymodule
目录中创建一个main.go
文件。main.go
文件通常在go程序中用于指示程序的起始点。文件的名称没有其中的main
函数重要,但是将两者匹配可以让它更容易找到。在本教程中,main
函数将打印出`Hello, Modules!跑的时候。
要创建该文件,使用nano
或你喜欢的文本编辑器打开main.go
文件:
nano main.go
在main.go
文件中,添加以下代码来定义你的main
包,导入fmt
包,然后在main
函数中打印出Hello, Modules!
消息:
projects/mymodule/main.go
package main
import "fmt"
func main() {
fmt.Println