Golang 学习笔记(二)——命令基础

go build

go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包。如果我们在执行go build命令时不后跟任何代码包,那么命令将试图编译当前目录所对应的代码包。

  1. 如果是 main 包,当你执行go build之后,它就会在当前目录下生成一个可执行文件。如果你需要在$GOPATH/bin下生成相应的文件,需要执行go install,或者使用go build -o 路径
  2. 如果是普通包(即非 main 包),当你执行go build之后,它不会产生任何文件。如果你需要在$GOPATH/pkg下生成相应的文件,那就得执行go install了。
  3. 如果某个项目文件夹下有多个文件,而你只想编译某个文件,就可在go build之后加上文件名,例如go build a.gogo build命令默认会编译当前目录下的所有 go 文件。

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

1
array_linux.go array_darwin.go array_windows.go array_freebsd.go

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

标记名称 标记描述
-a 强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建,即使它们已经是最新的了。
-n 打印编译期间所用到的其它命令,但是并不真正执行它们。
-p n 指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在darwin/arm平台(即iPhone和iPad所用的平台)下,该数量默认是1
-race 开启竞态条件的检测。不过此标记目前仅在linux/amd64freebsd/amd64darwin/amd64windows/amd64平台下受到支持。
-v 打印出那些被编译的代码包的名字。
-work 打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。
-x 打印编译期间所用到的其它命令。注意它与-n标记的区别。
-o 指定编译输出的文件名

go install

命令go install用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。
go build命令一样,传给go install命令的代码包参数应该以导入路径的形式提供。并且,go build命令的绝大多数标记也都可以用于go install命令。
实际上,go install命令只比go build命令多做了一件事,即:安装编译后的结果文件到指定目录($GOPATH/pkg或者$GOPATH/bin)。

go run

想要运行命令源码文件就需要使用命令go run
go run命令可以编译并运行命令源码文件。由于它其中包含了编译动作,因此它也可以接受所有可用于go build命令的标记。除了标记之外,go run命令只接受 Go 源码文件作为参数,而不接受代码包。

go get

这个命令是用来动态获取远程代码包的,目前支持的有 BitBucket、GitHub、Google Code 和Launchpad。这个命令在内部实际上分成了两步操作:第一步是下载源码包,第二步是执行go install
一般情况下,为了分离自己与第三方的代码,我们会设置两个或更多的工作区。我们现在有一个目录路径为~/golang/lib的工作区,并且它是环境变量GOPATH值中的第一个目录路径。好了,如果我们使用go get命令下载和安装代码包,那么这些代码包都会被安装在上面这个工作区中。

go fmt

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

go clean

这个命令是用来移除当前源码包里面编译生成的文件。一般都是利用这个命令清除编译文件,然后 github 递交源码,在本机测试的时候这些编译文件都是和系统相关的,但是对于源码管理来说没必要。
这些文件和目录包括:

  1. 在使用go build命令时在当前代码包下生成的与包名同名或者与 Go 源码文件同名的可执行文件。
  2. 在执行go test命令并加入-c标记时在当前代码包下生成的以包名加“.test”后缀为名的文件。
  3. 如果执行go clean命令时带有标记-i,则会同时删除安装当前代码包时所产生的结果文件(即pkg目录的相应目录下的归档文件和bin目录下的可执行文件)。
  4. 还有一些目录和文件是在编译Go或C源码文件时留在相应目录中的。包括:“_obj”和“_test”目录,名称为“_testmain.go”、“test.out”、“build.out”或“a.out”的文件,名称以“.5”、“.6”、“.8”、“.a”、“.o”或“.so”为后缀的文件。这些目录和文件是在执行go build命令时生成在临时目录中的。
  5. 如果执行go clean命令时带有标记-r,则还包括当前代码包的所有依赖包的上述目录和文件。

go doc

go doc命令可以打印附于 Go 语言程序实体(变量、常量、函数、结构体以及接口)上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。
通过命令在命令行执行godoc -http=:端口号比如godoc -http=:8080。然后在浏览器中打开127.0.0.1:8080,你将会看到一个 golang.org 的本地版本,通过它你可以查询 pkg 文档等其它内容。如果你设置了 GOPATH,在 pkg 分类下,不但会列出标准包的文档,还会列出你本地 GOPATH 中所有项目的相关文档。
go doc命令的标记说明

标记名称 标记描述
-c 加入此标记后会使go doc命令区分参数中字母的大小写。默认情况下,命令是大小写不敏感的。
-cmd 加入此标记后会使go doc命令同时打印出main包中的可导出的程序实体(其名称的首字母大写)的文档。默认情况下,这部分文档是不会被打印出来的。
-u 加入此标记后会使go doc命令同时打印出不可导出的程序实体(其名称的首字母小写)的文档。默认情况下,这部分文档是不会被打印出来的。

go test

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

go fix

命令go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码,不包括其子代码包中的文件。

其他命令

1
2
3
go version 	查看go当前的版本
go env 查看当前go的环境变量
go list 列出当前全部安装的package

参考资料
谢大的《Go Web 编程》
郝林的《Go语言命令中文教程》