浅谈GOROOT、GOPATH、Package、Project与Workspace
本文最后更新于 2022年11月21日 晚上
学习 Golang 时,被其包管理和项目管理弄得很狼狈,所以写一些有关 GOROOT、GOPATH、Project与Workspace 的总结。
GOROOT
GOROOT
定义为指定安装 GO 的根目录。在 Go 1.0 之后,go tool
利用它查找 Go 编译器(保存在$GOROOT/pkg/tool/$GOOS_$GOARCH
)和标准库(在$GOROOT/pkg/$GOOS_$GOARCH
)。- 现在你已经无须在环境变量中人为设置
GOROOT
的值,因为 Go 工具链中现在已经内置了正确的值。- 除非:
- 如果你是 Linux、FreeBSD 或者 OS X 用户,通过从 golang.org 下载的 zip 和 tarball 的二进制包来安装环境。这些二进制文件的默认
GOROOT
位于 /usr/local/go,因此建议将 Go 安装到这个位置。否则,就必须设置GOROOT
到你指定的目录。 - 如果你是 Windows 用户,使用 从 golang.org 下载的 zip 二进制包安装,默认的
GOROOT
在 C:\Go 目录。如果你将 Go 安装在其他位置,需要将设置GOROOT
到指定的目录。
- 如果你是 Linux、FreeBSD 或者 OS X 用户,通过从 golang.org 下载的 zip 和 tarball 的二进制包来安装环境。这些二进制文件的默认
- 除非:
- 如果你尝试人为设置
GOROOT
,这将会覆盖掉保存在 go 工具链中的默认值,可能会导致 go 执行不同版本的编译器和标准库文件。 - 可以将Golang 的
GOROOT
理解为 Java 的JAVA_HOME
。
GOPATH
-
GOPATH
环境变量定义了你的工作空间位置。它或许是你在开发Go代码时, 唯一需要设置的环境变量。 -
默认情况下
GOPATH
为$HOME/go
目录,其中$HOME
就是你自己计算机账户根目录。所以,我们可以通过修改环境变量$GOPATH
来改变 GO 的默认设置。 -
工作空间可以放在任何地方,但是绝对不能把
GOPATH
设置成GOROOT
的路径,否则两者会共用各自路径下的src
、pkg
、bin
。 -
GOPATH
定义的工作区下,有三个目录:-
src
是存放所有.go
文件或源代码的位置-
go get
下载的包一般会保存在这里-
由于
go get
一般使用的是 git 的线路,需要设置 Git 的代理1
2git config --global http.proxy ProxyAddress
git config --global https.proxy ProxyAddress
-
-
-
pkg
是存储预编译目标文件的地方,以加速程序的后续编译,可以安全地删除 -
bin
是存放go install
编译后生成的可执行文件的地方- 为了方便,可以将此工作空间的
bin
子目录添加到你的PATH
中
- 为了方便,可以将此工作空间的
-
-
正确的结构示例
1 |
|
- GoLand 可以设置全局、项目、模块的
GOPATH
,全局的GOPATH
就是在环境变量中设置的值。一般情况下,只需要设置全局的GOPATH
,并遵循上面正确的结构示例,就能正常编译和调试了。 Go Modules
是Go 1.11中新增的实验性功能,可以有效的解决GOPATH
麻烦的包管理问题,现在(2022 年)已经成为主流的包管理方式。
Package
-
Golang 中包的作用是组织源码。一个包表示磁盘上单个目录中的所有文件。一个目录只能包含同一包中的某些文件。
-
包与所有用户编写的 Go 源文件一起存储在
$GOPATH/src
目录下。 -
示例
-
如果我们的代码的位置是
$GOPATH/src/blue/red/green
那么它的包名应该是red
。 -
red
包的 import 语句为1
import "blue/red/green"
-
-
每个
.go
文件都属于且仅属于一个包,必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package ABC
。- 可执行命令必须使用
package main
- 可执行命令必须使用
-
import
可以导入包,但是事实上,它是导入目录
Project
- Project 并不是 Golang 所特有的,而是一种项目的组织形式,记录了项目信息。
- 一个项目通常是包含了该工程的所有源代码,可以认为每一个单独的实验的所有代码的集合都是一个项目。项目之间是彼此独立的。
Workspace
-
工作区是多个项目的集合,不仅记录了所有的项目信息,同时还保存了下现在的工作状态。
-
你可以通过工作区来快速恢复到上一次关闭工作区时的状态,从而提高效率。
-
然而工作区完全是人造的概念,所以工作区目录本身是复杂化的,因为它面向编辑器而不是人,也有人认为如果项目的规划好,是无须使用工作区的。
参考资料
- https://dave.cheney.net/2013/06/14/you-dont-need-to-set-goroot-really
- https://golang.org/doc/gopath_code.html
- https://go-zh.org/doc/code.html
- https://www.cnblogs.com/zhaof/p/7906722.html
- https://learnku.com/go/wikis/26456
- https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md