GOPATH 与 Go Modules

GolangBeginner
立即练习

介绍

在本实验中,我们将学习 Go 语言中两种不同的依赖管理方式:GOPATH 和 Go Modules。这些是有效组织和管理 Go 项目的核心概念。

知识点:

  • GOPATH
  • GOROOT
  • Go Modules

准备工作

在这一步中,我们将通过解压提供的压缩包来准备实验环境。

  1. 首先,打开终端并输入以下命令进入项目目录:

    cd ~/project
    
  2. 在当前目录下解压 helloWorld.tar.gz 文件:

    tar -xzf helloWorld.tar.gz
    
  3. 文件解压后,检查 helloWorld 文件夹是否已成功创建:

    ls helloWorld
    

如果解压正确,该命令将列出 helloWorld 目录的内容。

基础模式 GOPATH

在 Go 1.11 版本之前,Go 使用一个名为 GOPATH 的特定工作区来存储所有的 Go 代码。在这一步中,我们将了解 GOPATH 的工作原理。

  1. GOROOT 是 Go 的安装目录,其中包含 Go 工具链和标准库包。
  2. GOPATH 是你存放个人 Go 代码的地方,它包含三个子目录:
    • src:存储项目的源代码。
    • bin:存储编译后的可执行文件。
    • pkg:存储编译后的非可执行包文件。

要检查当前的 GOPATHGOROOT 设置,请运行以下命令:

## 查看 GOPATH 目录
go env | grep GOPATH

## 查看 GOROOT 目录
go env | grep GOROOT

这些命令将显示你机器上配置的 GOPATHGOROOT 路径。

初始化模块

Go Modules 在 Go 1.11 中引入,并在 Go 1.13 中默认启用,旨在解决两个主要问题:

  • 对 GOPATH 的过度依赖:在 Go Modules 出现之前,代码必须存储在 GOPATH/src 目录下。有了 Go Modules,你可以将代码存储在系统中的任何位置。
  • 版本依赖问题:Go Modules 允许项目管理和跟踪特定版本的依赖项,使得处理同一个包的不同版本变得更加容易。

在这一步中,我们将为一个新项目初始化 Go Module。

  1. 为项目创建一个名为 testHello 的新目录:

    cd ~/project
    mkdir testHello
    
  2. 进入 testHello 目录:

    cd testHello
    
  3. 为该项目初始化 Go Module:

    go mod init testHello
    

    输出结果应为:

    go: creating new go.mod: module testHello
    
  4. testHello 文件夹内创建一个名为 testHello.go 的新 Go 文件,内容如下:

    touch testHello.go
    
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("hello, world")
    }
    

现在,我们已经使用 Go Modules 初始化了 testHello 项目,并添加了一个简单的 Go 程序。

使用模块导入其他包

在这一步中,我们将演示如何在 Go 项目中导入和使用其他模块。

helloWorld 文件夹中的 helloWorld 包已经通过 Go Modules 进行了初始化。同样,test 包也使用了 Go Modules,并从 helloWorld 包中导入了 Say 函数。

为了探索这一点,请运行以下命令:

  1. 首先,查看 helloWorldtest 目录的结构:

    helloWorld
    ├── go.mod
    └── helloWorld.go
    test
    ├── go.mod
    └── test.go
    
  2. 接下来,打开 test/go.mod 文件。你应该会看到以下内容:

    module test
    
    go 1.15
    
    require "helloWorld" v0.0.1
    replace "helloWorld" => "../helloWorld"
    

replace 指令告诉 Go 使用本地路径 ../helloWorld,而不是从外部仓库获取。require 指令指定了 test 包依赖于 helloWorld 包的 v0.0.1 版本。

参数 描述
module 指定当前包名
require 指定依赖项
replace 替换依赖项路径
exclude 排除依赖项

运行 test 包中的 test.go 文件:

cd ~/project/test
go run test.go

输出结果应为:

hello, world

导入远程包

在 Go 中,你可以轻松地导入远程包。让我们通过使用 GitHub 上的远程包来演示这一点。

  1. 创建一个目录 remoteModule

    cd ~/project
    mkdir remoteModule
    cd remoteModule
    
  2. 初始化 Go Module:

    go mod init remoteModule
    
  3. remoteModule 文件夹内创建一个 remote.go 文件,内容如下:

    touch remote.go
    
    package main
    
    import (
        "github.com/labex-labs/golang-dev-code/chap02module"
    )
    
    func main() {
        chap02module.StringTobase64("miiy")
    }
    

    该程序从 GitHub 导入了 chap02module 包,并使用了其中的 StringTobase64 函数。

  4. 使用以下命令运行 remote.go 文件:

    go get github.com/labex-labs/golang-dev-code/chap02module
    go run -v remote.go
    

    提示:免费用户无法访问互联网,因此无法运行此命令。升级到 Pro 计划以获得互联网访问权限。

go get 命令会从 GitHub 下载 chap02module 包并将其存放在模块缓存中。完成后,go run 命令将执行你的程序。

小测试

在这一步中,我们将通过创建一个使用远程模块中 Hello 函数的新文件来检验所学知识。

  1. 创建一个文件夹 remoteModule2

    cd ~/project
    mkdir remoteModule2
    cd remoteModule2
    
  2. 初始化 Go Module:

    go mod init remoteModule2
    
  3. 创建一个 remote2.go 文件,内容如下:

    touch remote2.go
    
    package main
    
    import (
        "github.com/labex-labs/golang-dev-code/chap02module"
    )
    
    func main() {
        chap02module.Hello()
    }
    
  4. 运行程序:

    go get github.com/labex-labs/golang-dev-code/chap02module
    go run remote2.go
    

    输出结果应为:

    hello
    

总结

在本实验中,我们学习了以下内容:

  • GOPATHGOROOT 目录的含义和用途。
  • 使用 Go Modules 管理依赖的基础知识。
  • 如何在项目中初始化和使用 Go Modules。
  • 如何导入和使用本地及远程 Go 包。

完成本实验后,你应该能够熟练地使用 Go Modules 来管理 Go 项目中的依赖关系。

✨ 查看解决方案并练习