查看go语言自带命令

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

go 编译为ios go编译命令_ico

 

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

gopath通常有如下图的目录结构。

go 编译为ios go编译命令_go 编译为ios_02

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 编译为ios go编译命令_golang_03

 

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

     

go 编译为ios go编译命令_golang_04

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

  

go 编译为ios go编译命令_ico_05

 

    2)再来使用go mod verify

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

    

go 编译为ios go编译命令_github_06

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

    

go 编译为ios go编译命令_github_07

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

    

go 编译为ios go编译命令_ico_08

     如果依赖的源代码被修改了,go mod verify命令也会有提示的。

 

    3)go mod why命令

             执行go mod why命令,参数m后面跟上依赖路径,就是显示依赖所在的工程项目。

            

go 编译为ios go编译命令_github_09

   

      5. go mod vendor命令

    主要讲工程里所有的依赖全部放入到工程项目根目录下vendor目录下,这个其实和php中composer包管理很像。这样使用vendor后,可以将依赖和gopath全部独立开来。

    执行go mod vendor命令后,就会在当前目录生成一个vendor目录,该文件夹下将会放置你go.mod文件描述的依赖包,和上面说的gopath路径下mod目录一样,同时文件夹下同时还有一个文件modules.txt,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先删除。

    

go 编译为ios go编译命令_github_10