本文翻译自《Call your code from another module》。
在上一节中,你创建了一个greetings
模块。在本节中,你将编写代码来调用刚刚编写的模块中的Hello
函数。你将编写可作为应用程序执行的代码,并调用greetings
模块中的代码。
注意:本主题是从《创建一个Go模块》开始的多部分教程的一部分。
1 为你的Go模块源代码创建一个hello目录。这是你将编写调用者的地方。
创建此目录后,你应该在目录层次结构中的同一级别拥有hello目录和greetings目录,如下所示:
<home>/
|-- greetings/
|-- hello/
例如,如果你的命令提示符位于greetings目录中,你可以使用以下命令:
cd ..
mkdir hello
cd hello
2 为你将要编写的代码启用依赖项跟踪。
要为你的代码启用依赖项跟踪,请运行go mod init
命令,指定你的代码所在模块的名称。
出于本教程的目的,使用example.com/hello
作为模块路径。
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
3 在你的文本编辑器中,在hello目录中,创建一个用于编写代码的文件,并将其命名为hello.go。
4 编写代码调用Hello
函数,然后打印函数的返回值。 为此,将以下代码粘贴到hello.go中。
package main
import (
"fmt"
"example.com/greetings"
)
func main() {
// 获取一句问候语并打印输出它。
message := greetings.Hello("Gladys")
fmt.Println(message)
}
在此代码中,你:
- 声明一个
main
包。在Go中,作为应用程序执行的代码必须在main
包中。
- 导入两个包:
example.com/greetings
和fmt
包。这使你的代码可以访问这些包中的函数。导入example.com/greetings
(你之前创建的模块中包含的包)可以让你访问Hello
函数。你还导入fmt
,具有处理输入和输出文本的功能(例如将文本打印到控制台)。
- 通过调用greetings包的
Hello
函数获取一句问候语。
5 编辑example.com/hello
模块以使用本地example.com/greetings
模块。
对于生产环境,你将从代码仓库中发布example.com/greetings
模块(具有反映其发布位置的模块路径),Go工具可以在其中找到它并进行下载。现在,因为你还没有发布该模块,所以你需要调整example.com/hello
模块,以便它可以在你的本地文件系统上找到example.com/greetings
代码。
为此,请使用go mod edit
命令编辑example.com/hell
o模块,将Go工具从其模块路径(模块不在的位置)重定向到本地目录(它所在的位置)。
5.1 从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
5.2 从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
包时,你就创建了这个依赖项。
模块路径后面的数字是一个伪版本号(pseudo-version number)——一个生成的数字,用来代替语义版本号(该模块目前还没有)。
要引用已发布的模块,go.mod
文件通常会省略replace
指令并使用末尾带有标签版本号的require
指令。
require example.com/greetings v1.1.0
有关版本号的更多信息,请参阅模块版本编号。
6 在hello目录中的命令行提示符下,运行你的代码以确认它是否有效。
$ go run .
Hi, Gladys. Welcome!
恭喜!你已经编写了两个功能模块。
在下一主题中,你将添加一些错误处理。