Go从入门到精通——包(package)——工作目录(GOPATH)
工作目录(GOPATH)
Go 语言的源码复用建立在包(package)基础之上。Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,必须同样以包的方式进行引用。
Go 语言的包与文件夹一一对应,所有与包相关的操作,必须依赖于工作目录(GOPATH)。
1、工作目录(GOPATH)
GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录。
工作目录是一个工程开发的相对参考目录。好比当你要在公司编写一套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区。工作区的概念与工作目录的概念也是类似的。
如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,输出的二进制运行文件也不统一,这样会导致开发的标准不统一,影响开发效率。
GOPATH 适合处理大量 Go 语言源码、多个包组合而成的复杂工程。
C、C++、Java、C# 及其他语言发展到后期,都拥有自己的 IDC(集成开发环境),并且工程(Project)、解决方案(Solution)和工作区(Workspace)等概念将源码和资源组织了起来,方便编译和输出。
2、使用命令行查看 GOPATH 信息
在命令行中运行 go env 后,命令行将提示以下信息:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\WINDOWS\system32> go env
set GO111MODULE=on
set GOARCH=amd64 //GOARCH 表示目标处理器架构。
set GOBIN= //GOBIN 表示编译器和链接器的安装位置。
set GOCACHE=C:\Users\zuoyang\AppData\Local\go-build
set GOENV=C:\Users\zuoyang\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\zuoyang\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows //GOOS 表示目标操作系统。
set GOPATH=C:\Users\zuoyang\go //GOPATH 表示当前工作目录
set GOPRIVATE=
set GOPROXY=https://goproxy.cn //GOPROXY 表示 Go 代理
set GOROOT=C:\Program Files\Go //GOROOT 表示 Go 开发包的安装目录
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.18.1
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\zuoyang\AppData\Local\Temp\go-build435273393=/tmp/go-build -gno-record-gcc-switches
PS C:\WINDOWS\system32>
3、使用 GOPATH 的工程结构
在 GOPATH 指定的工作目录下,代码总是会保存在 $GOPATH/src 目录下。
在工程经过 go build、go install 或 go get 等指令后,会将产生的二进制可执行文件放在 $GOPATH/bin 目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下。
如果需要将整个源码添加到版本管理工具(gitlab)中时,只需要添加 $GOPATH/src 目录的源码即可。bin 和 pkg 目录的内容都可以由 src 目录生成。
4、设置和使用 GOPATH
基操,略,不想写了。
5、在多项目工程中使用 GOPATH
在很多与 Go 语言相关的资料、文章中描述的 GOPTH 都是通过系统全局的环境变量来实现的。这种设置全局 GOPATH 的方法可能灰度熬制当前项目错误引用了其他目录的 Go 源码文件从而造成编译输出错误的版本或编译报出一些无法理解的错误提示。
比如说,将某项目代码保存在 /home/zy/projectA 目录下,将该目录设置为 GOPATH。随着开发进行,需要再次获取一份工程项目的源码,此时源码保存在 /home/zy/projectB 目录下,如果此时编译 projectB 目录的项目,但开发者忘记设置 GOPATH 而直接使用命令编译,则当前的 GOPATH 指向的是 /home/zy/projectA 目录,而不是开发者编译时期望的 projectB 目录。编译完成后,开发者就会将错误的工程版本发布到外网。
因此,建议大家无论是使用命令行或者使用集成开发环境编译 Go 源码时,GOPATH 跟随项目设定。在 Jetbrains 公司的 GoLand 集成开发环境(IDC)中的 GOPATH 设置分为全局 GOPATH 和项目 GOPATH。
上图中
- 全局GOPATH 代表全局 GOPATH,一般来源于系统环境变量的 GOPATH,我这里使用的是 Go 默认的目录。
- 项目GOPATH 代表项目所使用的 GOPATH,该设置会被保存在工作目录的 .idea 目录下,不会被设置到环境变量的 GOPATH 中,但会在编译时使用到这个目录。
建议在开发时,只填写项目 GOPATH,每一个项目尽量只设置一个 GOPATH,不使用多个 GOPATH 和全局的 GOPATH。