查看go语言自带命令
查看go自带的命令,在终端输入go命令或者go help。

go主要命令解释
1. build: 编译包和依赖。
2. clean: 移除当前源码包里面编译生成的文件。
3. doc: 显示包或者符号的文档。
4. env: 打印go的环境信息,查看GOPATH,GOROOT环境变量都可以使用该命令查看。
5. bug: 启动错误报告。
6. fix: 运行go tool fix。
7. fmt: 运行gofmt进行格式化。
8. generate: 从processing source生成go文件。
9. get: 下载并安装包和依赖。
10. install: 编译并安装包和依赖。
11. list: 列出包。
12. run: 编译并运行go程序。
13. test: 自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。
14. tool: 运行go提供的工具。
15. version: 显示当前环境安装go的版本。
16. vet: 运行go tool vet。
Go Module
之前我们go项目都是基于gopath来建立,gopath通常有如下图的目录结构。

GOPATH目录下一共包含了三个子目录,分别是:
-
bin:存储所编译生成的二进制文件。
-
pkg:存储预编译的目标文件,以加快程序的后续编译速度。
-
src:存储所有
.go文件或源代码。在编写 Go 应用程序,程序包和库时,一般会以$GOPATH/src/github.com/foo/bar的路径进行存放。
gopath主要有两个作用,一个是保存依赖的代码和可执行文件及pkg目录下的函数库,另一个作用是项目开发工作空间。但是将这两个放在一起是不太方便与开发的,最关键是没有依赖管理。
后来开源社区推出了很多依赖管理工具,目前最主流的包依赖管理方式是使用官方推荐的 Go Module。
go module介绍#
go module是go官方自带的go依赖管理库,它是go相关包依赖的集合,在Go 1.14 版本中正式推荐可以用在生产上,go module由vgo发展而来。
go module组成
go module主要由三部分组成:
1. 集成在go命令里的工具集:提供了download,edit等8个命令,下面会说。
2. go.mod 文件:保存了所有的依赖列表,根据文件中的依赖项顺序。
3. go.sum 文件:主要用于版本的管理,保存了不同的版本所对应的hash值,用于校验依赖从而避免依赖被修改。
一般go.mod 文件和go.sum 文件都是在项目的根目录下面,而且都是通过命令来修改里面的内容。
go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等。
go mod 有以下命令:
| 命令 | 说明 |
|---|---|
| download | download modules to local cache(下载依赖的module到本地cache) |
| edit | edit go.mod from tools or scripts(编辑go.mod文件) |
| graph | print module requirement graph (打印模块依赖图) |
| init | initialize new module in current directory(在当前文件夹下初始化一个新的module, 创建go.mod文件) |
| tidy | add missing and remove unused modules(增加丢失的module,去掉未用的module) |
| vendor | make vendored copy of dependencies(将依赖复制到vendor下,注意依赖需要在import 中声明后才能进行导入) |
| verify | verify dependencies have expected content (校验依赖) |
| why | explain why packages or modules are needed(解释为什么需要依赖) |
go mod命令使用
1. 使用 go mod init module名: go mod init通常就是初始化工程项目用的。
我们在本地先建立一个空目录,该目录可以是你本地GOPATH路径任何一个地方。
$ go mod init modDemo go: creating new go.mod: module modDemo $ ll total 8 drwxr-xr-x 3 songguojun staff 96 10 27 14:17 ./ drwxr-xr-x 39 songguojun staff 1248 10 27 14:15 ../ -rw-r--r-- 1 songguojun staff 24 10 27 14:17 go.mod #初始化之后目录多了go.mod文件
查看go.mod文件内容
$ cat go.mod
module modDemo #第一行是当前module的名字
go 1.14 #定义了go使用的版本号
我们在当前目录在创建一个main.go文件,main.go代码如下:
package main import ( "fmt" "github.com/hashicorp/golang-lru" ) func main(){ l, _ := lru.New(128) for i := 0; i < 256; i++ { l.Add(i, nil) } fmt.Println("-->", l.Len()) }
上面代码是引入了go的一个内存排序lru包,我们不用关心。
我们在项目根目录下执行go bulid构建,发现多了go.sum文件和modDemo*文件。
$ go build $ ll total 4344 drwxr-xr-x 6 songguojun staff 192 10 27 14:31 ./ drwxr-xr-x 39 songguojun staff 1248 10 27 14:15 ../ -rw-r--r-- 1 songguojun staff 72 10 27 14:30 go.mod -rw-r--r-- 1 songguojun staff 181 10 27 14:30 go.sum -rw-r--r-- 1 songguojun staff 194 10 27 14:31 main.go -rwxr-xr-x 1 songguojun staff 2209672 10 27 14:31 modDemo*
看下go.sum文件内容,里面包含了就是一些hash值。
songguojundeMacBook-Pro:gomodule songguojun$ cat go.sum github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
2. go mod graph:输入工程当前所有的依赖。
直接在上面那个工程目录执行go mod graph命令,如下所示:
$ go mod graph
modDemo github.com/hashicorp/golang-lru@v0.5.4
3. go mod download : 使用此命令来下载指定的模块到本地。
go module所管理的一些依赖库文件依然存放在GOPATH下面,download所下载的依赖储存在 $GOPATH/src/mod 中,而缓存路径是 $GOPATH/pkg/mod/cache 。
我们执行 go mod download之后,查看工程所依赖的库hashicorp就位于mod目录下面,如下
$ ls /Users/songguojun/go/pkg/mod/github.com/ !burnt!sushi fatih godoctor josharian mattn ramya-rao-a spf13 acroca gin-contrib golang json-iterator mdempsky rogpeppe stamblerre cosiner gin-gonic hashicorp karrick modern-go sergi ugorji cweill go-delve haya14busa keegancsmith peterh sirupsen uudashr davidrjenni go-playground inconshreveable leodido pkg skratchdot willf
这样使用go mod download命令就可以将工程项目的依赖下载下来。
4. go mod tidy & go mod verify & go mod why:
go mod tidy:就是把不需要的依赖给删除掉。
go mod verify:验证mod里依赖是否正确,同时也会验证go源代码其它依赖的内容。
go mod why:可以展示及指定依赖关系。比如代码中有个依赖包,但是并不知道这个包的依赖关系,这时候就可以使用这个命令查看。
1)先看第一个命令go mod tidy,我们将代码里下图这部分注释掉,就相当于没有使用依赖。

然后查看go.mod里依赖使用内容,确认依赖存在。

我们开始执行go mod tidy命令,执行完后,go.mod里的依赖项已尽被删除了。

2)再来使用go mod verify
我们将上面的go.mod文件复原,并修改其中的依赖版本号,将这个版本号修改为一个不存在的版本号。

当执行go mod verify命令后就会提示错误,说明可以对依赖的版本进行校验。

如果依赖没有问题就提示通过。

如果依赖的源代码被修改了,go mod verify命令也会有提示的。
3)go mod why命令
执行go mod why命令,参数m后面跟上依赖路径,就是显示依赖所在的工程项目。

5. go mod vendor命令
主要讲工程里所有的依赖全部放入到工程项目根目录下vendor目录下,这个其实和php中composer包管理很像。这样使用vendor后,可以将依赖和gopath全部独立开来。
执行go mod vendor命令后,就会在当前目录生成一个vendor目录,该文件夹下将会放置你go.mod文件描述的依赖包,和上面说的gopath路径下mod目录一样,同时文件夹下同时还有一个文件modules.txt,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先删除。

