在go语言中环境变量GOPATH和GOROOT需要设置好才可进行开发编译,学过JAVA的朋友理解起来就比较快,这里就这两个变量作个详细的说明,不足之处,请大家批评指正。
1. GOROOT
简而言之,GOROOT在GO语言中表示的是go语言编译、工具、标准库等的安装路径,在Linux系统中一般安装在/usr/go或者/usr/local/go,这样Linux系统中的PATH变量一般都包含了这两个目录,所以就可以直接运行go命令,而Windows系统中一般默认安装在C:\go中。
如果自定义安装go的话,需要设置GOROOT的值,比如在Linux系统中用户如有root用户权限时,想安装go至自己的工作目录中,就要设置GOROOT为自己的HOME目录中,假设安装在/home/目录中的go目录,则需要这样设置GOROOT:
export GOROOT=$HOME/go
最好将这条命令放到.bashrc中,这样每次登录就可以自动配置GOROOT。
为了确定GOROOT值,可以使用go env命令显示当前的值:
[root@TEST ~]# go env GOROOT
/usr/lib/golang
[root@TEST ~]#
Windows中的设置环境变量也很简单,如下图:
2. GOPATH
GOPATH环境变量则表示go的工作目录,这个目录指定了需要从哪个地方寻找GO的包、可执行程序等,这个目录可以是多个目录表示,go编译或者运行时会从这个环境变量中去对应查找,可能还不够清晰,工作目录或者如官方文档中说的workspace,可以这么理解为GO源码目录,在这个目录进行编译、链接最后生成所需要的库、可执行文件,我们对比C程序的目录,也许更能方便理解,一般在C的工程项目中包含三个文件,一个include目录、src目录、Makefile文件。
include目录存放了所有的头文件可供其他地方包含
src目录则存放所有的.c后缀的源文件
Makefile则是该项目的编译,在编译整个工程时需要执行make命令,这里就发现GO就不需要去写什么Makefile了,执行build命令就可以自动编译。
如下图示:
而在go项目中,一般来说它的工作目录结构是这样的:
bin目录包含了可执行程序,注意是可执行的,不需要解释执行。
pkg目录包含了使用的包或者说库。
src里面包含了go的代码源文件,其中仍按包的不同进行组织。
上图中我们建立了一个main包和util包目录,注意在go里面包名一般和目录名相同,main.go是主入口程序,它调用util中的函数,util目录中提供可用的API,我们来看一下工程的编译过程:
首先确认GOPATH:
[root@TEST goprojects]# go env GOPATH
/root/work/goprojects
[root@TEST goprojects]#
需要编译哪个包就直接编译即可,比如编译main:
编译在当前目录中生成main可执行文件,其实在GOPATH目录下对单个包进行编译跟进入该包中进行编译效果一样,你可以进入到main目录中编译,同样会生成main可执行文件 :
注意如果go build后面不指定包的名称,则会提示错误:
你也可以指定all来编译整个工程:
前面的main可执行程序为什么没有在bin目录中生成?
go还有一个命令install,区别在于build只是进行编译,不会将可执行文件放到bin目录,而go install则即编译又将其copy到指定目录:
go install 也可指定包名,这里执行了go install all,表示所有包都install到相应目录:
可以看到可执行程序main被install到bin目录中,util包作为静态库install到pkg目录中,linux_386是系统架构名称(这个值跟具体的系统架构有关)。
3. 包的引入import
我们来看一下前面main.go的源码:
我们当前的目录结构是这样的:
执行编译go build main,没有问题,编译成功。
下面我们修改一下目录结构,如下:
再执行编译:
我们发现直接import util 会导致编译失败,提示无法找到包,从提示信息来看,我们也可以了解到go在编译时会从GOROOT和GOPATH两个地方寻找包,我们修改一下code:
这样就可以正常编译了,结论就是GOROOT和GOPATH必须设置正确,且对于GO标准库而言,import的时候不需要写全路径,而对于GOPATH中的包而言需要根据目录层次写清楚包的path。
4. go get命令
这个命令不得不说,如果需要从远程仓库(比如git repo)中获取源码,go get命令就需要使用到了,
它不仅会从远程仓库中获取包的源码,同时会进行编译和install。
希望本文中对GOROOT/GOPATH编译相关的说明能对各位有一定的帮助,OK,谢谢各位的阅读!
--------------------------------------------------------华丽的分割线--------------------------------------------------------------
本文已在公众号“Golang自学社区”原创发布,更多内容,欢迎关注!
有疑问加站长微信联系(非本文作者)