Go常用命令

Go语言自带有一套完整的命令操作工具,你可以通过在命令行中执行go来查看它们:
在这里插入图片描述
这些命令对于我们平时编写的代码非常有用,接下来就让我们了解一些常用的命令。

go build

这个命令主要用于编译代码。compile packages and dependencies这是命令的详细信息,意思是在包的编译过程中,若有必要,会同时编译与之相关联的包,也就是说依赖包也会编译。

如果是普通包,当你执行go build之后,它不会产生任何文件。如果你需要在$GOPATH/pkg下生成相应的文件,那就得执行go install。

如果是main包,当你执行go build之后,它就会在当前目录下生成一个可执行文件。如果你需要在$GOPATH/bin下生成相应的文件,需要执行go install,或者使用go build -o 路径/a.exe。

如果某个项目文件夹下有多个文件,而你只想编译某个文件,就可在go build之后加上文件名,例如go build a.go;go build命令默认会编译当前目录下的所有go文件。

go build会忽略目录下以“_”或“.”开头的go文件。

如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作系统后缀来命名文件。例如有一个读取数组的程序,它对于不同的操作系统可能有如下几个源文件:
array_linux.go

array_darwin.go

array_windows.go

array_freebsd.go

go build的时候会选择性地编译以系统名结尾的文件(Linux、Darwin、Windows、Freebsd)。例如Linux系统下面编译只会选择array_linux.go文件,其它系统命名后缀文件全部忽略。

参数的介绍

-o 指定输出的文件名,可以带上路径,例如 go build -o a/b/c

-i 安装相应的包,编译+go install

-a 更新全部已经是最新的包的,但是对标准包不适用

-n 把需要执行的编译命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的

-p n 指定可以并行可运行的编译数目,默认是CPU数目

-race 开启编译的时候自动检测数据竞争的情况,目前只支持64位的机器

-v 打印出来我们正在编译的包名

-work 打印出来编译时候的临时文件夹名称,并且如果已经存在的话就不要删除

-x 打印出来执行的命令,其实就是和-n的结果类似,只是这个会执行

-ccflags ‘arg list’ 传递参数给5c, 6c, 8c 调用

-compiler name 指定相应的编译器,gccgo还是gc

-gccgoflags ‘arg list’ 传递参数给gccgo编译连接调用

-gcflags ‘arg list’ 传递参数给5g, 6g, 8g 调用

-installsuffix suffix 为了和默认的安装包区别开来,采用这个前缀来重新安装那些依赖的包,-race的时候默认已经是-installsuffix race,大家可以通过-n命令来验证

-ldflags ‘flag list’ 传递参数给5l, 6l, 8l 调用

-tags ‘tag list’ 设置在编译的时候可以适配的那些tag

go clean

这个命令是用来移除当前源码包和关联源码包里面编译生成的文件。remove object files and cached files 这是命令的详细信息,也就是清除编译生成的文件的。

参数介绍

-i 清除关联的安装的包和可运行文件,也就是通过go install安装的文件

-n 把需要执行的清除命令打印出来,但是不执行,这样就可以很容易的知道底层是如何运行的

-r 循环的清除在import中引入的包

-x 打印出来执行的详细命令,其实就是-n打印的执行版本

go env

用于打印Go语言的环境信息。print Go environment information这个是命令详细信息。go env命令能够让我们对当前的Go语言环境进行简要的了解。通过它,我们也可以对当前安装的Go语言的环境设置进行简单的检查。

参数介绍

-json 以json格式输出配置
-u 取消env配置
-w 设置env

go fix

命令go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。这里所说的版本即Go语言的版本。代码包的所有Go语言源码文件不包括其子代码包(如果有的话)中的文件。修正操作包括把对旧程序调用的代码更换为对新程序调用的代码、把旧的语法更换为新的语法,等等。

在编程语言的升级和演进的过程中,难免会对过时的和不够优秀的语法及标准库进行改进。这样的改进对于编程语言的向后兼容性是个挑战。简单来说,向后兼容性就是指新版本的编程语言程序能够正确识别和解析用该编程语言的旧版本编写的程序和软件,以及在新版本的编程语言的运行时环境中能够运行用该编程语言的旧版本编写的程序和软件。对于Go语言来说,语法的改变和标准库的变更都会使得用旧版本编写的程序无法在新版本环境中编译通过。这就等于破坏了Go语言的向后兼容性。对于一个编程语言、程序库或基础软件来说,向后兼容性是非常重要的。但有时候为了让软件更加优秀,软件的开发者或维护者不得不在向后兼容性上做出一些妥协。这是一个在多方利益之间进行权衡的结果。go fix这个工具正是Go语言的创造者们为了不让这种妥协给语言使用者带来困扰和额外的工作量而编写的自动化修正工具。这也充分体现了Go语言的软件工程哲学。

命令go fix其实是命令go tool fix的简单封装。这甚至比go fmt命令对gofmt命令的封装更简单。像其它的Go命令一样,go fix命令会先对作为参数的代码包导入路径进行验证,以确保它是正确有效的。go fix命令会把有效代码包中的所有Go语言源码文件作为多个参数传递给go tool fix命令。实际上,go fix命令本身不接受任何标记,它会把加入的所有标记都原样传递给go tool fix命令。

go fmt

go强制了代码格式(比如左大括号必须放在行尾),不按照此格式的代码将不能编译通过,为了减少浪费在排版上的时间,go工具集中提供了一个go fmt命令 它可以帮你格式化你写好的代码文件,使你写代码的时候不需要关心格式,你只需要在写完之后执行go fmt <文件名>.go,你的代码就被修改成了标准格式,但是我平常很少用到这个命令,因为开发工具里面一般都带了保存时候自动格式化功能,这个功能其实在底层就是调用了go fmt。
gofmt (reformat) package sources命令详细信息就是格式化代码。
使用go fmt命令,其实是调用了gofmt,而且需要参数-w,否则格式化结果不会写入文件。gofmt -w -l src,可以格式化整个项目,所以go fmt是gofmt的上层一个包装的命令。

参数介绍

-l 显示那些需要格式化的文件

-w 把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。

-r 添加形如“a[b:len(a)] -> a[b:]”的重写规则,方便我们做批量替换

-s 简化文件中的代码

-d 显示格式化前后的diff而不是写入文件,默认是false

-e 打印所有的语法错误到标准输出。如果不使用此标记,则只会打印不同行的前10个错误。

-cpuprofile 支持调试模式,写入相应的cpufile到指定的文件

go generate

这个命令是从Go1.4开始才设计的,用于在编译前自动化生成某类代码。go generate和go build是完全不一样的命令,通过分析源码中特殊的注释,然后执行相应的命令。这些命令都是很明确的,没有任何的依赖在里面。而且大家在用这个之前心里面一定要有一个理念,这个go generate是给你用的,不是给使用你这个包的人用的,是方便你来生成一些代码的。

这里我们来举一个简单的例子,例如我们经常会使用yacc来生成代码,那么我们常用这样的命令:

go tool yacc -o gopher.go -p parser gopher.y

-o 指定了输出的文件名, -p指定了package的名称,这是一个单独的命令,如果我们想让go generate来触发这个命令,那么就可以在当前目录的任意一个xxx.go文件里面的任意位置增加一行如下的注释:

//go:generate go tool yacc -o gopher.go -p parser gopher.y

这里我们注意了,//go:generate是没有任何空格的,这其实就是一个固定的格式,在扫描源码文件的时候就是根据这个来判断的。

所以我们可以通过如下的命令来生成,编译,测试。如果gopher.y文件有修改,那么就重新执行go generate重新生成文件就好。

$ go generate
$ go build
$ go test

go get

这个命令是用来动态获取远程代码包的,目前支持的有BitBucket、GitHub、Google Code和Launchpad。这个命令在内部实际上分成了两步操作:第一步是下载源码包,第二步是执行go install。下载源码包的go工具会自动根据不同的域名调用不同的源码工具,对应关系如下:

BitBucket (Mercurial Git)
GitHub (Git)
Google Code Project Hosting (Git, Mercurial, Subversion)
Launchpad (Bazaar)

所以为了go get 能正常工作,你必须确保安装了合适的源码管理工具,并同时把这些命令加入你的PATH中。

参数介绍

-d 只下载不安装

-f 只有在你包含了-u参数的时候才有效,不让-u去验证import中的每一个都已经获取了,这对于本地fork的包特别有用

-fix 在获取源码之后先运行fix,然后再去做其他的事情

-t 同时也下载需要为运行测试所需要的包

-u 强制使用网络去更新包和它的依赖包

-v 显示执行的命令

go install

这个命令在内部实际上分成了两步操作:第一步是生成结果文件(可执行文件或者.a包),第二步会把编译好的结果移到 G O P A T H / p k g 或 者 GOPATH/pkg或者 GOPATH/pkgGOPATH/bin。

go list

列出指定的代码包的信息。list packages or modules命令详细信息。

参数介绍

-json 以json格式显示
-f format 以指定格式显示
-m 使list列出模块而不是包。

go mod

go mod init                    生成go.mod文件
go mod download         下载go.mod文件中指明的所有依赖
go mod tidy                   整理现有的依赖
go mod graph                查看现有的依赖结构
go mod edit                   编辑go.mod文件
go mod vendor              导出项目所有的依赖到vendor目录
go mod verify                 校验一个模块是否被篡改过
go mod why                   查看为什么需要依赖某模块

go run

用于编译main代码包,以及运行编译后的可执行程序。go run命令可以编译并运行命令源码文件。由于它其中包含了编译动作,因此它也可以接受所有可用于go build命令的标记。除了标记之外,go run命令只接受Go源码文件作为参数,而不接受代码包。与go build命令和go install命令一样,go run命令也不允许多个命令源码文件作为参数,即使它们在同一个代码包中也是如此。而原因也是一致的,多个命令源码文件会都有main函数声明。

如果命令源码文件可以接受参数,那么在使用go run命令运行它的时候就可以把它的参数放在它的文件名后面,像这样:

go run test.go -p ~/golang/goc2p

我们使用go run命令运行命令源码文件test.go。这个命令源码文件可以接受一个名称为“p”的参数。我们用“-p”这种形式表示“p”是一个参数名而不是参数值。它与源码文件名之间需要用空格隔开。参数值会放在参数名的后面,两者成对出现。它们之间也要用空格隔开。如果有第二个参数,那么第二个参数的参数名与第一个参数的参数值之间也要有一个空格。以此类推。

go run命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于main包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么go run命令就只会打印错误提示信息并退出,而不会继续执行。

在通过参数检查后,go run命令会将编译参数中的命令源码文件,并把编译后的可执行文件存放到临时工作目录中。

go test

执行这个命令,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。输出的信息类似

ok   archive/tar   0.011s
FAIL archive/zip   0.022s
ok   compress/gzip 0.033s
...

默认的情况下,不需要任何的参数,它会自动把你源码包下面所有test文件测试完毕,当然你也可以带上参数。

参数介绍

-bench regexp 执行相应的benchmarks,例如 -bench=.

-cover 开启测试覆盖率

-run regexp 只运行regexp匹配的函数,例如 -run=Array 那么就执行包含有Array开头的函数

-v 显示测试的详细命令

go tool

go tool下面聚集了很多命令,这里我们只介绍两个,fix和vet。

go tool fix . 用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1,例如API的变化。

go tool vet directory|files 用来分析当前目录的代码是否都是正确的代码,例如是不是调用fmt.Printf里面的参数不正确,例如函数里面提前return了然后出现了无用代码之类的。

go version

输出Go的版本信息。print Go version这是命令详细信息。

参数介绍

-v 能够输出无法识别的文件
-m 打印当前二进制编译版本信息,还可以输出依赖包信息,和go module对齐的。

go vet

是一个用于检查Go语言源码中静态错误的简单工具,用来检测错误的。report likely mistakes in packages这是命令详细信息。
我们可以在提交到仓库之前,对你的code base执行go vet扫错。

参数介绍

-n 用于只打印流程中执行的命令而不是真正执行它们。
-x 在执行命令的同时打印命令。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值