首页 文章详情

「每周译Go」Understanding_the_GOPATH

GoCN | 63 2022-07-26 04:55 0 0 0
UniSMS (合一短信)

理解 GOPATH

介绍

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

Go 工作区 是 Go 管理源码文件、编译的二进制文件和用于后续更快编译的缓存对象。虽然可能有多个空间,但只有一个 Go 工作区是典型的,也是被建议的使用方式。GOPATH 充当工作区的根文件夹。

设置 $GOPATH 环境变量

$GOPATH 环境变量列出了 Go 用来寻找 Go 工作区的地方。

默认情况下,Go 假设 GOPATH 位于 $HOME/go,其中 $HOME 是电脑上上我们帐户的根目录。我们可以通过设置 $GOPATH 环境变量来修改它。为了进一步的研究,请参考在 Linux 中阅读和设置环境变量的教程。

想要了解更多关于设置 $GOPATH 变量的信息,可以参考 Go 文档。

此外,[本系列教程]({{< relref "/docs/01-How_To_Install_Go_and_Set_Up_a_Local Programming_Environment_on_Ubuntu_18.04_DigitalOcean.md" >}}) 简单介绍了安装 Go 和设置 Go 开发环境的方法。

$GOPATH 不是 $GOROOT

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

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

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

Go 工作区剖析

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

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

让我们来看看每个目录。

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

例如,如果我们不在 $PATH 中添加 $GOPATH/bin 来执行一个程序,我们需要运行:

$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

import "blue/red"

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 设置中比较棘手的一个方面,但是一旦设置好了,我们通常会忘记它。


相关链接:

Go 工作区:https://golang.org/doc/code.html#Workspaces

在 Linux 中阅读和设置环境变量:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps

Go 文档:https://golang.org/doc/code.html#Workspaces

Go Modules:https://github.com/golang/Go/wiki/Modules


2022 GopherChina大会报名仍在火热进行中!

扫描下方二维码即可报名参与哦~

大会合作、现场招聘及企业购票等事宜请联系微信:18516100522

记得分享、在看与点赞哦~

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter