• 简体中文
  • 从其他模块调用你的代码

    注意: 本文是系列教程的一部分,该系列始于 创建 Go 模块

    上一节 中,你创建了一个 greetings 模块。在本节中,你将编写代码来调用你刚刚编写的模块中的 Hello 函数。你将编写可以作为一个应用程序执行的代码,并调用 greetings 模块中的代码。

    步骤

    1. 为你的 Go 模块源代码创建一个 hello 目录

    这是你将编写调用者的位置。

    创建此目录后,你的目录结构应如下所示,hellogreetings 目录在同一层级:

    <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.go 的文件

    在你的文本编辑器中,在 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 工具从其模块路径(模块不存在的地方)重定向到本地目录(模块存在的地方)。

    a. 替换模块路径

    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

    b. 同步依赖项

    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

    有关版本号的更多信息,请参阅 模块版本编号

    6. 运行你的代码以确认其是否正常工作

    hello 目录的命令提示符下,运行你的代码:

    $ go run .
    Hi, Gladys. Welcome!

    结论

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

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