此为 《极客时间&Go语言核心36讲》 个人笔记,具体课程详见极客时间官网。
Table of Contents generated with DocToc
- 第一讲 工作区和GOPATH
- 1. 环境变量配置
- 2. 配置
GOPATH
的意义- 2.1
Go
语言源码的组织方式 - 2.2 源码安装后的结果(归档文件、可执行文件)
- 2.3 理解构建和安装Go程序的过程
- 2.1
- 3. 补充
- 3.1 go build命令一些可选项的用途和用法
- 3.2 go get
- 3.3 其他
第一讲 工作区和GOPATH
1. 环境变量配置
在这个过程需要配置3个环境变量:GOROOT
、GOPATH
、GOBIN
。
GOROOT
:Go
语言安装根目录的路径,也就是Go
语言的安装路径;GOPATH
:若干工作区目录的路径,是我们自己定义的工作空间;GOBIN
:GO
程序生成的可执行文件的路径;
2. 配置GOPATH
的意义
可以把GOPATH
简单理解成Go
语言的工作目录,它的值是一个路径,在 GOPATH
指定的工作目录下,代码总是会保存在 $GOPATH/src
目录下。在工程经过go build
、go install
或 go get
等指令后,会将产生的二进制可执行文件放在 $GOPATH/bin
目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg
下。
环境变量 GOPATH
指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件。
由于Go
语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都围绕GOPATH
和工作区进行,所以可以拓展出其他问题:
2.1 Go
语言源码的组织方式
和大多数编程语言一样,Go
语言的源码也是以代码包为基本单位的。每个代码包都会有导入路径,在使用程序实体之前都必须导入其所在的代码包,例如:
import "github.com/labstack/echo"
在工作区中,一个代码包的导入路径实际上就是从src
子目录,到该包的实际存储位置的相对路径。一般情况下,Go
语言的源码文件都需要被存放在环境变量GOPATH
包含的某个工作区(目录)中的src
目录下的某个代码包(目录)中。
2.2 源码安装后的结果(归档文件、可执行文件)
源码文件通常会被放在某个工作区的src
子目录下,那么在安装后如果产生了归档文件(xxx.a,程序编译后生成的静态库文件),就会放进该工作区的pkg
子目录;如果产生了可执行文件,就会放进该工作区的bin
子目录下。
归档文件的相对目录与pkg目录之间还有一集目录,叫做平台相关目录,一般是由构建(build
)的目标操作系统、下划线和木匾计算架构的代号组成。
2.3 理解构建和安装Go程序的过程
构建使用命令go build
,安装使用命令go install
,构建和安装代码包的时候都会执行编译、打包等操作。
库源码文件 | 命令源码文件 | |
---|---|---|
构建 | 操作的结果文件只存在于临时文件,这里构建的主要意义在于检查和验证 | 操作的结果文件会被搬运到源码文件所在的目录中 |
安装 | 先执行构建,然后还会进行链接操作,并把结果文件搬运到它所在工作区的pkg目录下的某个子目录中 | 结果文件会被搬运到它所在工作区的bin目录中,或者环境变量GOBIN指向的目录中 |
3. 补充
3.1 go build命令一些可选项的用途和用法
中go build
时,默认不会编译目标代码包所依赖的那些代码包,除非它依赖的代码包的归档文件不存在,或者(被依赖代码包的)源码文件有了变化,同时,还可以可以使用-a
来强制编译。另外,如果不但要编译依赖的代码包,还要安装它们的归档文件,可以使用-i
。
-x
:查看go build
命令具体都执行了哪些操作;-n
:查看操作而不执行;-v
:查看go build
命令编译的代码包名称;
3.2 go get
go get
会自动从一些主流代码库下载目标代码,并把它们安装到环境变量GOPATH
包含的第一个工作区的相应目录中。如果存在环境变量GOBIN
,那么仅包含命令源码文件的代码包会被安装到GOBIN
指向的那个目录。
-u
:下载并安装代码包,无论工作区是否已经存在它们;-d
:只下载代码包,但不安装;-fix
:下载代码包后,先运行一个修正代码的工具,然后再安装;-t
:下载并测试所需的代码包;-insecure
:允许通过非安全的网络协议下载和安装代码包;(例如:http
…)
3.3 其他
-
Go
语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?根据GOPATH从上到下查找。
-
如果多个工作区中存在导入路径相同的代码包会产生冲突吗?
不会,代码包上根据GOPATH从上到下查找,找到即可停止,先找到哪个就用哪个。