从另一个模块调用你的代码
在上一节中,你创建了一个
greetings 模块。在这一节,你将编写代码来调用你刚写的模块中的
Hello 函数。你将编写可作为应用程序执行的代码,该代码会调用
greetings 模块中的代码。
-
为你的 Go 模块源代码创建一个
hello目录。你将在此处编写你的调用者代码。创建此目录后,你应在层级结构中同时拥有一个 hello 和一个 greetings 目录,如下所示:
<home>/ |-- greetings/ |-- hello/
例如,如果你的命令提示符当前在 greetings 目录中,你可以使用以下命令:
cd .. mkdir hello cd hello
-
为你即将编写的代码启用依赖追踪。
要为你的代码启用依赖追踪,请运行
go mod init命令,并为其指定你的代码所在的模块名称。在本教程中,请使用
example.com/hello作为模块路径。$ go mod init example.com/hello go: creating new go.mod: module example.com/hello
- 在你的文本编辑器中,于 hello 目录下创建一个文件以编写代码,并将其命名为 hello.go。
-
编写代码以调用
Hello函数,然后打印该函数的返回值。为此,请将以下代码粘贴到 hello.go 中。
package main import ( "fmt" "example.com/greetings" ) func main() { // Get a greeting message and print it. message := greetings.Hello("Gladys") fmt.Println(message) }在这段代码中,你:
-
声明了一个
main包。在 Go 中,作为应用程序执行的代码必须位于main包中。 -
导入了两个包:
example.com/greetings和fmt包。这使你的代码可以访问这些包中的函数。导入example.com/greetings(你之前创建的模块所包含的包)使你可以访问Hello函数。你还导入了fmt,它包含用于处理输入和输出文本的函数(例如将文本打印到控制台)。 -
通过调用
greetings包的Hello函数获取问候语。
-
声明了一个
-
编辑
example.com/hello模块以使用你本地的example.com/greetings模块。对于生产环境使用,你会从其代码仓库发布
example.com/greetings模块(使用反映其发布位置的模块路径),Go 工具可以从那里找到并下载它。 目前,由于你尚未发布该模块,你需要调整example.com/hello模块,以便它能在你的本地文件系统上找到example.com/greetings代码。为此,请使用
go mod edit命令来编辑example.com/hello模块,将 Go 工具从其模块路径(模块不在那里)重定向到本地目录(模块所在位置)。-
在 hello 目录的命令提示符下,运行以下命令:
$ go mod edit -replace example.com/greetings=../greetings
该命令指定,为了定位依赖项,应将
example.com/greetings替换为../greetings。运行该命令后,hello 目录中的 go.mod 文件应包含一条replace指令:module example.com/hello go 1.16 replace example.com/greetings => ../greetings
-
在 hello 目录的命令提示符下,运行
go mod tidy命令以同步example.com/hello模块的依赖项,添加代码所需但尚未在模块中追踪的那些依赖项。$ go mod tidy go: found example.com/greetings in example.com/greetings v0.0.0-00010101000000-000000000000
命令完成后,
example.com/hello模块的 go.mod 文件应如下所示:module example.com/hello go 1.16 replace example.com/greetings => ../greetings require example.com/greetings v0.0.0-00010101000000-000000000000
该命令在 greetings 目录中找到了本地代码,随后添加了一个
require指令,用于声明example.com/hello模块依赖example.com/greetings。这个依赖关系是在您于 hello.go 文件中导入greetings包时建立的。模块路径后的数字是一个伪版本号 -- 一种生成的数字标识符,用于替代语义化版本号(该模块目前尚未分配版本号)。
对于已发布的模块,go.mod 文件通常不会包含
replace指令,而是使用带有标签版本号的require指令。require example.com/greetings v1.1.0
有关版本号的更多信息,请参阅模块版本编号。
-
在 hello 目录的命令提示符下,运行以下命令:
-
在
hello目录的命令提示符处运行代码以确认其正常工作。$ go run . Hi, Gladys. Welcome!
恭喜!您已编写了两个可正常工作的模块。
在下一主题中,您将学习如何添加错误处理。