了解GOPATH

来自菜鸟教程
(重定向自了解GOPATH
跳转至:导航、​搜索

介绍

本文将引导您了解 GOPATH 是什么、它是如何工作的以及如何设置它。 这是设置 Go 开发环境以及了解 Go 如何查找、安装和构建源文件的关键步骤。 在本文中,当提到我们将要讨论的文件夹结构的概念时,我们将使用 GOPATH。 我们将使用 $GOPATH 来引用 Go 用来查找文件夹结构的环境变量。

Go 工作区 是 Go 管理我们的源文件、编译的二进制文件和缓存对象的方式,以便以后更快地编译。 尽管可以有多个空间,但通常也建议只有一个 Go Workspace。 GOPATH 充当工作区的根文件夹。

设置 $GOPATH 环境变量

$GOPATH 环境变量列出了 Go 查找 Go Workspaces 的位置。

默认情况下,Go 假设我们的 GOPATH 位置位于 $HOME/go,其中 $HOME 是我们计算机上用户帐户的根目录。 我们可以通过设置 $GOPATH 环境变量来改变它。 如需进一步学习,请按照在Linux中读取和设置环境变量的教程进行操作。

有关设置 $GOPATH 变量的更多信息,请参阅 Go 文档

此外,本 系列 将介绍安装 Go 并设置 Go 开发环境。

$GOPATH 不是 $GOROOT

$GOROOT 是 Go 的代码、编译器和工具所在的地方——这是 而不是 我们的源代码。 $GOROOT 通常类似于 /usr/local/go。 我们的 $GOPATH 通常类似于 $HOME/go

虽然我们不再需要专门设置 $GOROOT 变量,但它仍然在旧材料中被引用。

现在,让我们讨论一下 Go Workspace 的结构。

Go 工作区剖析

在 Go 工作区或 GOPATH 内部,有三个目录:binpkgsrc。 这些目录中的每一个对 Go 工具链都有特殊的意义。

.
├── bin
├── pkg
└── src
  └── github.com/foo/bar
    └── bar.go

让我们来看看这些目录中的每一个。

$GOPATH/bin 目录是 Go 放置 go install 编译的二进制文件的地方。 我们的操作系统使用 $PATH 环境变量来查找可以在没有完整路径的情况下执行的二进制应用程序。 建议将此目录添加到我们的全局 $PATH 变量中。

例如,如果我们不将 $GOPATH/bin 添加到 $PATH 以从那里执行程序,我们将需要运行:

$GOPATH/bin/myapp

$GOPATH/bin 添加到 $PATH 时,我们可以像这样进行相同的调用:

myapp

$GOPATH/pkg 目录是 Go 存储预编译的目标文件的地方,以加快程序的后续编译。 通常,大多数开发人员不需要访问此目录。 如果您遇到编译问题,您可以安全地删除此目录,然后 Go 将重建它。

src 目录是我们所有 .go 文件或源代码必须所在的位置。 这不应与 Go 工具使用的源代码混淆,该源代码位于 $GOROOT。 当我们编写 Go 应用程序、包和库时,我们会将这些文件放在 $GOPATH/src/path/to/code 下。

什么是包?

Go 代码以包的形式组织。 包代表磁盘上单个目录中的所有文件。 一个目录只能包含同一包中的某些文件。 包与所有用户编写的 Go 源文件一起存储在 $GOPATH/src 目录下。 我们可以通过导入不同的包来理解包解析。

如果我们的代码位于 $GOPATH/src/blue/red,那么它的包名应该是 red

red 包的导入语句将是:

import "blue/red"

位于源代码存储库(如 GitHub 和 BitBucket)中的包将存储库的完整位置作为其导入路径的一部分。

例如,我们将使用以下导入路径在 https://github.com/gobuffalo/buffalo 导入源代码:

import "github.com/gobuffalo/buffalo"

因此,此源代码将位于磁盘上的以下位置:

$GOPATH/src/github.com/gobuffalo/buffalo

结论

在本文中,我们讨论了 GOPATH 作为 Go 期望我们的源代码存在于其中的一组文件夹,以及这些文件夹是什么以及它们包含什么。 我们讨论了如何通过设置 $GOPATH 环境变量将该位置从默认的 $HOME/go 更改为用户的选择。 最后,我们讨论了 Go 如何在该文件夹结构中搜索包。

在 Go 1.11 中引入的 Go Modules 旨在取代 Go Workspaces 和 GOPATH。 虽然建议开始使用模块,但某些环境(例如公司环境)可能尚未准备好使用模块。

GOPATH 是设置 Go 中比较棘手的方面之一,但是一旦设置好,我们通常可以忘记它。