浅谈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 到指定的目录。
  • 如果你尝试人为设置 GOROOT ,这将会覆盖掉保存在 go 工具链中的默认值,可能会导致 go 执行不同版本的编译器和标准库文件
  • 可以将Golang 的 GOROOT 理解为 Java 的 JAVA_HOME

GOPATH

  • GOPATH 环境变量定义了你的工作空间位置。它或许是你在开发Go代码时, 唯一需要设置的环境变量。

  • 默认情况下 GOPATH$HOME/go 目录,其中 $HOME 就是你自己计算机账户根目录。所以,我们可以通过修改环境变量 $GOPATH 来改变 GO 的默认设置。

  • 工作空间可以放在任何地方,但是绝对不能GOPATH 设置成 GOROOT 的路径,否则两者会共用各自路径下的 srcpkgbin

  • GOPATH 定义的工作区下,有三个目录:

    • src 是存放所有 .go 文件或源代码的位置

      • go get 下载的包一般会保存在这里

        • 由于go get 一般使用的是 git 的线路,需要设置 Git 的代理

          1
          2
          git config --global http.proxy ProxyAddress 
          git config --global https.proxy ProxyAddress
    • pkg 是存储预编译目标文件的地方,以加速程序的后续编译,可以安全地删除

    • bin 是存放 go install 编译后生成的可执行文件的地方

      • 为了方便,可以将此工作空间的 bin 子目录添加到你的 PATH
  • 正确的结构示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
go_project     // go_project为GOPATH目录
-- bin
-- myApp1 // 编译生成
-- myApp2 // 编译生成
-- myApp3 // 编译生成
-- pkg
-- src
-- myApp1 // project1
-- models
-- controllers
-- others
-- main.go
-- myApp2 // project2
-- models
-- controllers
-- others
-- main.go
-- myApp3 // project3
-- models
-- controllers
-- others
-- main.go
  • 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

  • 工作区是多个项目的集合,不仅记录了所有的项目信息,同时还保存了下现在的工作状态

  • 你可以通过工作区来快速恢复到上一次关闭工作区时的状态,从而提高效率。

  • 然而工作区完全是人造的概念,所以工作区目录本身是复杂化的,因为它面向编辑器而不是人,也有人认为如果项目的规划好,是无须使用工作区的。

参考资料


浅谈GOROOT、GOPATH、Package、Project与Workspace
https://justloseit.top/浅谈GOROOT、GOPATH、Package、Project与Workspace/
作者
Mobilis In Mobili
发布于
2020年10月25日
更新于
2022年11月21日
许可协议