从另一个模块调用你的函数

本文翻译自《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/greetingsfmt。这使你的代码可以访问这些包中的函数。导入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/hello模块,将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!

恭喜!你已经编写了两个功能模块。

在下一主题中,你将添加一些错误处理

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注