教程:创建Go模块

这是介绍Go语言一些基本特性的系列教程的第一部分。如果您刚刚开始学习Go,请务必阅读 教程:Go语言入门,该教程介绍了 go命令、Go模块和非常简单的Go代码。

在本教程中,您将创建两个模块。第一个是库,旨在供其他库或应用程序导入。第二个是调用应用程序,它将使用第一个模块。

本教程的序列包含七个简短的主题,每个主题说明该语言的不同部分。

  1. 创建模块 -- 编写一个包含函数的小模块,可以从其他模块调用这些函数。
  2. 从另一个模块调用您的代码 -- 导入并使用您的新模块。
  3. 返回并处理错误 -- 添加简单的 错误处理。
  4. 返回随机问候语 -- 处理切片(Go的 动态大小数组)中的数据。
  5. 返回多人问候语 -- 在map(映射)中存储键值对。
  6. 添加测试 -- 使用Go内置的单元测试 功能来测试您的代码。
  7. 编译并安装应用程序 -- 在本地编译并安装您的代码。

前置要求

启动一个可供他人使用的模块

首先创建一个Go模块。在一个模块中,您可以收集一个或多个相关的包(package),以提供一组离散且有用的函数。例如,您可以创建一个模块,其中包含具有执行财务分析功能的包,以便其他编写财务应用程序的人可以使用您的工作。有关开发模块的更多信息,请参阅 开发和发布模块

Go代码被分组为包(package),包被分组为模块(module)。您的模块指定运行代码所需的依赖项,包括Go版本和所需的其他模块集。

当您在模块中添加或改进功能时,您会发布该模块的新版本。编写调用您模块中函数的开发人员可以导入该模块更新的包,并在新版本投入生产使用之前进行测试。

  1. 打开命令提示符并cd到您的主目录。

    在Linux或Mac上:

    cd
    

    在Windows上:

    cd %HOMEPATH%
    
  2. 为您的Go模块源代码创建一个greetings目录。

    例如,从您的主目录使用以下命令:

    mkdir greetings
    cd greetings
    
  3. 使用 go mod init命令启动您的模块。

    运行go mod init命令,提供您的模块路径 -- 这里使用example.com/greetings。如果您发布一个模块, 这必须是一个Go工具可以从中下载您模块的路径。 那将是您代码的仓库。

    有关使用模块路径命名模块的更多信息,请参阅 管理 依赖项

    $ go mod init example.com/greetings
    go: creating new go.mod: module example.com/greetings
    

    go mod init命令创建一个go.mod文件来跟踪您的 代码的依赖项。到目前为止,该文件仅包含您的 模块名称和您的代码支持的Go版本。但是,当您添加依赖项时, go.mod文件将列出您的代码所依赖的版本。这使得构建具有可重现性,并让您能够直接控制使用哪个模块版本。

  4. 在文本编辑器中,创建一个用于编写代码的文件,并将其命名为 greetings.go。
  5. 将以下代码粘贴到您的greetings.go文件中并保存文件。
    package greetings
    
    import "fmt"
    
    // Hello returns a greeting for the named person.
    func Hello(name string) string {
        // Return a greeting that embeds the name in a message.
        message := fmt.Sprintf("Hi, %v. Welcome!", name)
        return message
    }
    

    这是您模块的第一段代码。它向任何 请求问候语的调用者返回一个问候语。您将在下一步编写调用此函数的代码。

    在这段代码中,您:

    • 声明一个 greetings 包以收集相关函数。
    • 实现一个 Hello 函数来返回问候语。

      该函数接收一个类型为 stringname 参数,并返回一个 string 类型的值。在 Go 中,函数名以大写字母开头时,可被其他包中的函数调用。这在 Go 中被称为“导出名称”。有关导出名称的更多信息,请参阅 Go 语言之旅中的 导出名称 章节。

    • 声明一个 message 变量来保存您的问候语。

      在 Go 中,:= 操作符是一种在一行内声明并初始化变量的快捷方式(Go 会使用右侧的值来推断变量类型)。如果采用较长的写法,您可能会这样写:

      var message string
      message = fmt.Sprintf("Hi, %v. Welcome!", name)
      
    • 使用 fmt 包的 Sprintf 函数 来创建问候消息。第一个参数是一个格式字符串,Sprintf 会将 name 参数的值替换到 %v 格式化动词的位置。插入 name 参数的值后,完整的问候文本便形成了。
    • 将格式化后的问候文本返回给调用者。

在下一步中,您将从另一个模块调用此函数。