非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第8章 包管理
- 8.1 工作区
- 8.1.1 工作区结构
- 8.1.2 GOPATH
- 8.1.3 GOROOT
- 8.1.4 GOBIN
第8章 包管理
对于大部分编程语言来说,代码包都是最有效的代码管理方式,Go语言也是使用包来管理代码的。如同其他语言一样,Go语言包的主要作用是把功能相似或相关的代码组织在同一个包中,以方便查找和使用。
这一章会详细介绍Go语言工程结构和包的使用。熟练掌握包管理是Go语言编码的基础。【必须掌握!】
8.1 工作区
Go语言中没有工程文件的概念,而是通过目录结构来体现工程的结构关系。
Go代码必须放在工作区中。
8.1.1 工作区结构
工作区其实就是一个对应于特定工程的目录,它应包含三个子目录:src目录、pkg目录和bin目录。如下所示:
其中各目录的作用如下:
- src目录:用于以代码包的形式组织并保存Go源码文件(如.go、.c、.h、.s等),同时也是Go编译时查找代码的地方。
- pkg目录:用于存放经由go get/install命令构建安装后的代码包的“.a”归档文件,也是编译生成的lib文件存储的地方。
- bin目录:与pkg目录类似,在通过go get/install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
目录src用于包含所有的源代码,是Go命令行工具一个强制的规则,而pkg和bin则无须手动创建,必要时Go命令行工具在构建过程中会自动创建这些目录。
【提示】
归档文件也就是分类,在Linux中就是把一些文件放在一个包中归类,一般扩展名为“.a”,意思是archive。在C程序中也指程序编译后生成的静态库文件。
8.1.2 GOPATH
GOPATH可以理解为工作目录或工作区,也是平时接触最多的一个环境变量。它可以是一个目录,也可以是多个目录路径,每个目录代表一个工作区。
Go的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕GOPATH来进行的。
GOPATH必须要设置,但并不是固定不变的,GOPATH的目的是为了告知Go需要代码的时候去哪里查找。需要注意的是,这里的代码包括本项目和引用外部项目的代码。
GOPATH可以随着项目的不同而重新设置。
在实际开发环境中,工作目录往往有多个。这些工作目录的目录路径都需要添加至GOPATH。
为了能够构建这个工程,需要先把所需工程的根目录加入到环境变量GOPATH中。否则,即使处于同一工作目录(工作区),代码之间也无法通过绝对代码包路径完成调用。
这里重点介绍一下如何使用命令行添加GOPATH。
- Windows下的GOPATH默认为:%USERPROFILE%\go;
- Linux下默认为:$HOME/go。
在Windows下,使用echo命令查看当前的GOPATH,需要在GOPATH前后添加“%”,表示为一个系统变量:
echo %GOPATH%
临时添加C:\NewProject目录到GOPATH可使用set命令,Windows下使用分号作为分隔符:
set GOPATH=%GOPATH%;C:\NewProject
没问题
使用set添加GOPATH,添加的是临时变量,当cmd窗口结束时,该变量就会结束。
重新打开 cmd
确实
如果想要永久添加一个GOPATH路径,可以使用setx,只需要将如上命令的“set”更换成“setx”即可。
在Linux下,查看GOPATH使用echo,须在GOPATH前添加“$”符号表示为系统变量:
好家伙,为啥这么多
临时添加一个/home/NewProject目录到GOPATH可使用如下命令,Linux下使用冒号作为分隔符:
GOPATH=$GOPATH: /home/NewProject
这样只是临时 的,应该重启后就会丢失
如果要永久添加该路径到GOPATH中,需要修改配置文件/etc/profile,向该文件末尾添加如下信息:
export GOPATH=$GOPATH:/home/NewProject
之后再使用source命令重新执行刚修改的初始化文件,使之立即生效:
source /etc/profile
OK
【一个问题】
如果GOPATH设置了多个工作区,那么查找依赖包时是以怎样的顺序进行呢?例如包a依赖包b,包b依赖包c,那么会先查找c包。那在工作区是如何查找这个依赖包c的呢?
【答案】首先,在查找依赖包的时候,总是会先查找GOROOT目录,也就是Go语言的安装目录,如果没有找到依赖的包,才到工作区去找相应的包。在工作区中是按照设置的先后顺序来查找的,也就是会从第一个开始依次查找,如果找到就不再继续,如果没有找到就报错。
如果多个工作区中存在导入路径相同的代码包会产生冲突吗?
【答案】不冲突,因为按顺序找到所需要的包就不往后继续找了。
【提示】
go get会下载代码包到src目录,但是只会下载到第一个工作区目录。
8.1.3 GOROOT
GOROOT是Go语言的程序安装目录,并非必须要设置的。Linux默认Go会安装在/usr/local/go下,但也允许自定义安装位置。
GOROOT的目的就是告知Go当前的安装位置,编译的时候从GOROOT去找SDK的system library。
Windows下查看GOROOT:
echo %GOROOT%
8.1.4 GOBIN
GOBIN目录一般为GOPATH的可执行文件放置目录,一般指bin。默认安装的Go语言是没有设置GOBIN目录的。
需要注意的是,只有当环境变量GOPATH中只包含一个工作区的目录路径时,go install命令才会把命令源码安装到当前工作区的bin目录下。
若环境变量GOPATH中包含多个工作区的目录路径,像这样执行go install命令就会失效,此时必须设置环境变量GOBIN。 【坑点】
Windows下查看GOBIN:
【默认没有,后面应该会看到的】