Golang — GOROOT、GOPATH、Go-Modules-三者的关系介绍
初学者没有搞明白的GOROOT,GOPATH,GOBIN,project目录
GOROOT & GOPATH
安装完golang1.13后,有两个路径GOROOT和GOPATH。
使用命令 go env 查看这两个路径:
GOROOT="/usr/local/go"
GOPATH="/Users/bytedance/go"
GOROOT下放的是golang本身的代码,当import一些golang自带的库,比如net/http时,程序会优先去GOROOT下寻找对应的库。
如果我们 import “github.com/gin-gonic/gin” ,程序到GOROOT路径下找不到这个库,就会去GOPATH路径下的src目录下找这个库。也就是说,GOPATH路径是专门用于存放第三方库(包括我们自己写的代码库)的。
GOPATH目录(可以理解为工作目录)如下:
go // go为GOPATH目录
-- bin
-- myApp1 // 编译生成
-- myApp2 // 编译生成
-- myApp3 // 编译生成
-- pkg
-- src
-- myApp1 // project1
-- models
-- controllers
-- others
-- main.go
-- myApp2 // project2
-- models
-- controllers
-- others
-- main.go
-- myApp3 // project3
-- models
-- controllers
-- others
-- main.go
当前我的GOPATH目录下是这样的
可见,我的cost_crawl项目里import的一些第三方库也同样被安装在src目录下(比如github.com目录下有许多从github下载的库,像gin之类的)
GOPATH的缺点
从上面可以看到,第三方库和自己写的项目都放在GOPATH的src目录下,而且需要使用go get命令来逐个下载第三方库(go get命令自动把第三方库下载到GOPATH/src目录)。
官方在go1.11后推出go modules的功能,有了go modules功能后,建议使用go modules的方法,项目目录也不需要再放到GOPATH/src目录下了。
首先要设定环境变量GO111MODULE,它有三个取值:
- auto:go判断当前目录是否满足以下两种情况,都满足的话就会开启modules功能
- 该项目目录不在GOPATH/src下
- 当前目录or上一层目录存在go.mod文件
- on:启用modules功能。
- off:不启用modules功能。
modules功能使用方法
在项目目录下运行命令 go mod init ,然后就会生成一个go.mod文件,文件里module默认使用项目目录名。此外还包含了go的版本、用到的第三方库等信息行。
此后可以用命令 go mod download 下载第三方库,也可以直接运行go build或者go install,也会自动安装第三方库。此时第三方库不再被安装在GOPATH/src下,而是下载到GOPATH/pkg/mod中
go run、go build、go install
go run
go run执行过程中,首先将程序编译成可执行文件,然后运行可执行文件,而且这个可执行文件在运行完毕后就会自动删除。go run一般用于测试。
go build
go build就是把程序编译成可执行文件,GOPATH目录下有一个bin文件夹专门用于存放go build出来可执行文件。但是似乎需要自己指定输出目录,比如:go build -o bin/main.exe src/webDemo/main.go
go install
go install执行时做了两件事情:
- 将非main套件编译成 .a 文件,放在pkg目录下
- 将main套件编译成可执行文件
好处在于,第二次编译时只需要编译main套件,可以复用之前编译好的 .a 文件(使用里面的函数)