Go语⾔GOPATH详解(Go语⾔⼯作⽬录)
GOPATH 是 中使⽤的⼀个环境变量,它使⽤绝对路径提供项⽬的⼯作⽬录。
⼯作⽬录是⼀个⼯程开发的相对参考⽬录,好⽐当你要在公司编写⼀套服务器代码,你的⼯位所包含的桌⾯、计算机及椅⼦就是你的⼯作区。⼯作区的概念与⼯作⽬录的概念也是类似的。如果不使⽤⼯作⽬录的概念,在多⼈开发时,每个⼈有⼀套⾃⼰的⽬录结构,读取配置⽂件的位置不统⼀,输出的⼆进制运⾏⽂件也不统⼀,这样会导致开发的标准不统⼀,影响开发效率。
GOPATH 适合处理⼤量 Go语⾔源码、多个包组合⽽成的复杂⼯程。
提⽰
C、、、 及其他语⾔发展到后期,都拥有⾃⼰的 IDE(集成开发环境),并且⼯程(Project)、解决⽅案(Solution)和⼯作区(Workspace)等概念将源码和资源组织了起来,⽅便编译和输出。
使⽤命令⾏查看GOPATH信息
在《》⼀节中我们已经介绍过 Go语⾔的安装⽅法。在安装过 Go 开发包的操作系统中,可以使⽤命令⾏查看 Go 开发包的环境变量配置信息,这些配置信息⾥可以查看到当前的 GOPATH 路径设置情况。在命令⾏中运⾏go env后,命令⾏将提⽰以下信息:
$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/davy/go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
命令⾏说明如下:
第 1 ⾏,执⾏ go env 指令,将输出当前 Go 开发包的环境变量状态。
第 2 ⾏,GOARCH 表⽰⽬标处理器架构。
第 3 ⾏,GOBIN 表⽰编译器和链接器的安装位置。
第 7 ⾏,GOOS 表⽰⽬标操作系统。
第 8 ⾏,GOPATH 表⽰当前⼯作⽬录。
第 10 ⾏,GOROOT 表⽰ Go 开发包的安装⽬录。
从命令⾏输出中,可以看到 GOPATH 设定的路径为:/home/davy/go(davy 为笔者的⽤户名)。
在 Go 1.8 版本之前,GOPATH 环境变量默认是空的。从 Go 1.8 版本开始,Go 开发包在安装完成后,将 GOPATH 赋予了⼀个默认的⽬录,参见下表。
GOPATH 在不同平台上的安装路径
平 台GOPATH 默认值举 例
Windows 平台%USERPROFILE%/go C:\Users\⽤户名\go
Unix 平台$HOME/go/home/⽤户名/go
使⽤GOPATH的⼯程结构
在 GOPATH 指定的⼯作⽬录下,代码总是会保存在 $GOPATH/src ⽬录下。在⼯程经过 go build、go install 或 go get 等指令后,会将产⽣的⼆进制可执⾏⽂件放在 $GOPATH/bin ⽬录下,⽣成的中间缓存⽂件会被保存在 $GOPATH/pkg 下。
如果需要将整个源码添加到版本管理⼯具(Version Control System,VCS)中时,只需要添加 $GOPATH/src ⽬录的源码即可。bin 和 pkg ⽬录的内容都可以由 src ⽬录⽣成。
设置和使⽤GOPATH
本节以 Linux 为演⽰平台,为⼤家演⽰使⽤ GOPATH 的⽅法。
1) 设置当前⽬录为GOPATH
选择⼀个⽬录,在⽬录中的命令⾏中执⾏下⾯的指令:
export GOPATH=`pwd`
该指令中的 pwd 将输出当前的⽬录,使⽤反引号`将 pwd 指令括起来表⽰命令⾏替换,也就是说,使⽤`pwd`将获得 pwd 返回的当前⽬录的值。例如,假设你的当前⽬录是“/home/davy/go”,那么使⽤`pwd`将获得返回值“/home/davy/go”。
使⽤ export 指令可以将当前⽬录的值设置到环境变量 GOPATH中。
2) 建⽴GOPATH中的源码⽬录
使⽤下⾯的指令创建 GOPATH 中的 src ⽬录,在 src ⽬录下还有⼀个 hello ⽬录,该⽬录⽤于保存源码。
mkdir -p src/hello
mkdir 指令的 -p 可以连续创建⼀个路径。
3) 添加源码⽂件
使⽤ Linux 编辑器将下⾯的源码保存为 并保存到 $GOPATH/src/hello ⽬录下。
1. package main
2.
3. import "fmt"
4.
5. func main(){
6. fmt.Println("hello")
7. }
4) 编译源码并运⾏
此时我们已经设定了 GOPATH,因此在 Go语⾔中可以通过 GOPATH 到⼯程的位置。
在命令⾏中执⾏如下指令编译源码:
go install hello
编译完成的可执⾏⽂件会保存在 $GOPATH/bin ⽬录下。
在 bin ⽬录中执⾏ ./hello,命令⾏输出如下:
hello world
在多项⽬⼯程中使⽤GOPATH
在很多与 Go语⾔相关的书籍、⽂章中描述的 GOPATH 都是通过修改系统全局的环境变量来实现的。然⽽,根据笔者多年的 Go语⾔使⽤和实践经验及周边朋友、同事的反馈,这种设置全局 GOPATH 的⽅法可能会导致当前项⽬错误引⽤了其他⽬录的 Go 源码⽂件从⽽造成编译输出错误的版本或编译报出⼀些⽆法理解的错误提⽰。
⽐如说,将某项⽬代码保存在 /home/davy/projectA ⽬录下,将该⽬录设置为 GOPATH。随着开发进⾏,需要再次获取⼀份⼯程项⽬的源码,此时源码保存在 /home/davy/projectB ⽬录下,如果此时需要编译 projectB ⽬录的项⽬,但开发者忘记设置 GOPATH ⽽直接使⽤命令⾏编译,则当前的 GOPATH 指向的是 /home/davy/projectA ⽬录,⽽不是开发者编译时期望的 projectB ⽬录。编译完成后,开发者就会将错误的⼯程版本发布到外⽹。
因此,建议⼤家⽆论是使⽤命令⾏或者使⽤集成开发环境编译 Go 源码时,GOPATH 跟随项⽬设定。go语言开发环境搭建
在 Jetbrains 公司的 GoLand 集成开发环境(IDE)中的 GOPATH 设置分为全局 GOPATH 和项⽬ GOPATH,如下图所⽰。
图:全局和项⽬GOPATH
图中的 Global GOPATH 代表全局 GOPATH,⼀般来源于系统环境变量中的 GOPATH;Project GOPATH 代表项⽬所使⽤的GOPATH,该设置会被保存在⼯作⽬录的 .idea ⽬录下,不会被设置到环境变量的 GOPATH 中,但会在编译时使⽤到这个⽬录。建议在开发时只填写项⽬ GOPATH,每⼀个项⽬尽量只设置⼀个 GOPATH,不使⽤多个 GOPATH 和全局的 GOPATH。
提⽰
Visual Studio 早期在设计时,允许 C++ 语⾔在全局拥有⼀个包含路径。当⼀个⼯程多个版本的编译,或者两个项⽬混杂有不同的共享全局包含时,会发⽣难以察觉的错误。在新版本 Visual Studio 中已经废除了这种全局包含的路径设计,并建议开发者将包含⽬录与项⽬关联。
Go语⾔中的 GOPATH 也是⼀种类似全局包含的设计,因此鉴于 Visual Studio 在设计上的失误,建议开发者不要设置全局的GOPATH,⽽是随项⽬设置 GOPATH。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论