聊聊GOPATH、GOROOT

jasonvfang · · 14243 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在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自学社区”原创发布,更多内容,欢迎关注!


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

14243 次点击  ∙  1 赞  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传