go 1.12

1.go build

编译包和依赖
用法:go build [-o output] [-i] [build flags] [packages]

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

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

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

  • -n 把需要执行的编译命令打印出来,但是不执行

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

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

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

  • -msan 启用与内存清理程序的操作。仅在linux / amd64,linux / arm64上支持并且只有Clang / LLVM作为主机C编译器。

  • -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 调用

  • -linkshared 链接共享库 -buildmode=共享。

  • -mod mode 模块下载模式使用:readonly,release或vendor。有关更多信息,请参阅“go help modules”。

  • -pkgdir dir 从dir安装并加载所有包

  • -tags 'tag list' 设置在编译的时候可以适配的那些tag,详细的tag限制参考里面的 Build Constraints

  • -toolexec'cmd args' 用于调用vet和asm等工具链程序的程序。例如,go命令将运行'cmd args / path / to / asm <asm的参数>',而不是运行asm。

    2.go clean

    删除掉执行其它命令时产生的一些文件和目录

  • _obj/ 旧的object目录,由Makefiles遗留

  • _test/ 旧的test目录,由Makefiles遗留

  • _testmain.go 旧的gotest文件,由Makefiles遗留

  • test.out 旧的test记录,由Makefiles遗留

  • build.out 旧的test记录,由Makefiles遗留

  • *.[568ao] object文件,由Makefiles遗留

  • DIR(.exe) 由 go build 产生

  • DIR.test(.exe) 由 go test -c 产生

  • MAINFILE(.exe) 由 go build MAINFILE.go产生

  • *.so

clean选项

  • -i 同时删除go install时所产生的存档或二进制(bin,pkg目录下的二进制文件)
  • -n 打印它将执行的remove命令,但不要运行它们
  • -r 会删除路径包及其依赖包的一些目录与文件
  • -x 打印remove命令的同时执行它们
  • -cache 删除go build产生的缓存实体
  • -testcache 删除go build产生的测试缓存实体
  • -modcache 删除整个模块下载缓存

3.go doc

显示包或者符号的文档
godoc -http=:8000在浏览器中阅读文档

用法:go doc [-u] [-c] [package|[package.]symbol[.methodOrField]]

打印与其标识的项目关联的文档注释
go doc接受零个,一个或两个参数。
当运行时没有参数

1
go doc

它在当前目录中打印包的包文档。

当使用一个参数运行时,参数选择取决于GOROOT和GOPATH中安装的内容,以及参数的形式,
这是示意图之一:

1
2
3
4
go doc <pkg>
go doc <sym>[.<methodOrField>]
go doc [<pkg>.]<sym>[.<methodOrField>]
go doc [<pkg>.][<sym>.]<methodOrField>

此参数列表中与参数匹配的第一个项目是其文档打印出来。但是,如果参数以大写字母开头
字母假定在当前目录中标识符号或方法。

对于包,扫描的顺序是GOROOT总是在GOPATH之前完整扫描。

如果没有指定或匹配的包,则包中的当前包目录被选中,因此“go doc Foo”会显示符号Foo的文档。

包路径必须是合格路径或正确后缀路径。go工具的常用包机制不适用:.和...,不是由go doc实现的。

当使用两个参数运行时,第一个必须是完整的包路径(而不仅仅是一个后缀),第二个是带有方法或结构字段的符号。
这类似于godoc接受的语法:

1
go doc <pkg> <sym> [.<methodOrField>]

例子:

  • go doc 显示当前包的文档。
  • go doc Foo 在当前包中显示Foo的文档。(Foo以大写字母开头,因此无法匹配包路径。)
  • go doc encoding/json 显示encoding/json包的文档。
  • go doc json encoding/json的简写。
  • go doc json.Number(或go doc json.number)显示json.Number的文档和方法摘要。
  • go doc json.Number.Int64(或go doc json.number.int64)显示json.Number的Int64方法的文档。
  • go doc cmd/doc 显示doc命令的包文档。
  • go doc -cmd cmd/doc 在doc命令中显示包文档和导出的符号。
  • go doc template.new 显示html/template的新功能的文档。(html/template在文本/模板之前是词法上的)
  • go doc text/template.new#一个参数显示文本/模板的新功能的文档。
  • go doc text/tmplate new#两个参数显示文本/模板的新功能的文档。

至少在当前目录中,这些调用都打印出来json.Decoder的Decode方法的文档:

1
2
3
4
go doc json.Decoder.Decode
go doc json.decoder.decode
go doc json.decode
cd go/src/encoding/json; go doc decode

标志:

  • -C 匹配符号时区分大小写。
  • -cmd 像常规包一样处理命令。否则在显示软件包的顶级文档时main包将隐藏导出符号。
  • -u 显示未导出和导出的文档符号,方法和字段。

4.go env

打印go的环境信息
用法:go env [-json] [var ...]

默认情况下,env将信息作为shell脚本打印(在Windows上,批处理文件)。一行一个变量。-json标志以JSON格式打印环境而不是作为shell脚本。

5.go bug

打开默认浏览器并启动新的错误报告。

6.go fix

用户:go fix [packages]

Fix在导入路径命名的包上运行Go fix命令。

有关修复的更多信息,请参阅“go doc cmd / fix”。
有关指定包的更多信息,请参阅“go help packages”。
要使用特定选项运行修复,请运行“go tool fix”。

7.go fmt

运行gofmt进行格式化
用法:go fmt [-n] [-x] [packages]

Fmt在导入路径包上运行命令'gofmt -l -w',它打印修改的文件的名称。

有关gofmt的更多信息,请参阅“go doc cmd / gofmt”。
有关指定包的更多信息,请参阅“go help packages”。

  • -n 打印将要执行的命令。
  • -x 在执行时打印命令。

要使用特定选项运行gofmt,请运行gofmt本身。

8.go generate

go generate命令是go 1.4版本里面新添加的一个命令,当运行go generate时,它将扫描与当前包相关的源代码文件,找出所有包含"//go:generate"的特殊注释,提取并执行该特殊注释后面的命令,命令为可执行程序,形同shell下面执行。
有几点需要注意:

  • 该特殊注释必须在.go源码文件中。
  • 每个源码文件可以包含多个generate特殊注释时。
  • 显示运行go generate命令时,才会执行特殊注释后面的命令。
  • 命令串行执行的,如果出错,就终止后面的执行。
  • 特殊注释必须以"//go:generate"开头,双斜线后面没有空格。

应用在有些场景下,我们会使用go generate:

  • yacc:从 .y 文件生成 .go 文件。
  • protobufs:从 protocol buffer 定义文件(.proto)生成 .pb.go 文件。
  • Unicode:从 UnicodeData.txt 生成 Unicode 表。
  • HTML:将 HTML 文件嵌入到 go 源码 。
  • bindata:将形如 JPEG 这样的文件转成 go 代码中的字节数组。

再比如:

string方法:为类似枚举常量这样的类型生成String()方法。
宏:为既定的泛型包生成特定的实现,比如用于ints的sort.Ints。

命令
go generate命令使用格式如下:
go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]

其中:

  • -run 正则表达式匹配命令行,仅执行匹配的命令
  • -v 输出被处理的包名和源文件名
  • -n 显示不执行命令
  • -x 显示并执行命令

执行go generate时,有一些环境变量可以使用:

  • $GOARCH 体系架构 (arm、amd64等待)
  • $GOOS OS环境(linux、windows等)
  • $GOFILE 当前处理中的文件名
  • $GOLINE 当前命令在文件中的行号
  • $GOPACKAGE 当前处理文件的包名
  • $DOLLAR

9.go get

用法:go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages]

获取导入路径命名的软件包以及它们的下载依赖。然后安装命名包,比如'go install'。

  • -d 只下载不安装
  • -f 只有在你包含了-u参数的时候才有效,不让-u去验证import中的每一个都已经获取了,这对于本地fork的包特别有用
  • -fix 在获取源码之后先运行fix,然后再去做其他的事情
  • -t 同时也下载需要为运行测试所需要的包
  • -u 强制使用网络去更新包和它的依赖包
  • -v 显示执行的命令
  • -insecure 标志允许从存储库中获取和解析使用不安全方案(如HTTP)的自定义域。谨慎使用。

Get还接受构建标志来控制安装。请参阅'go help build'。

签出新包时,get会创建目标目录 GOPATH/SRC/<包路径>。如果GOPATH包含多个条目,使用第一个。有关详细信息,请参阅:'go help gopath'。

签出或更新包时,查找分支或标签与本地安装的Go版本匹配。最重要的规则是,如果本地安装正在运行版本“go1”,则获取搜索名为“go1”的分支或标记。如果没有这样的版本它检索包的默认分支。

当获取签出或更新Git存储库时,它还会更新存储库引用的任何git子模块。

永远不会检出或更新存储在vendor目录中的代码。

有关指定包的更多信息,请参阅“go help packages”。

10.go install

编译并安装包和依赖
用法:go install [-i] [build flags] [packages]

  • -i 也会安装包的依赖项

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

参数支持go build的编译参数。大家只要记住一个参数-v就好了,这个随时随地的可以查看底层的执行信息。

11.go list

列出包
用法:go list [-f format] [-json] [-m] [list flags] [build flags] [packages]

12.go run

用法:go run [build flags] [-exec xprog] package [arguments ...]

编译并运行。
通常,包被指定为.go源文件列表,但它也可能是导入路径,文件系统路径或模式匹配单个已知包,如'go run'。 或'go run my/cmd'。

默认情况下,'go run'直接运行已编译的二进制文件:'a.out arguments ...'。
如果给出-exec标志,'go run'使用xprog调用二进制文件:'xprog a.out参数......'。
如果未给出-exec标志,则GOOS或GOARCH与系统不同默认情况下,可以找到名为go_ $ GOOS_ $ GOARCH_exec的程序在当前搜索路径上,'go run'使用该程序调用二进制文件。

13.go test

用法: go test [build/test flags] [packages] [build/test flags & test binary flags]
要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。

单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀,例如:

1
func TestXXX( t *testing.T )
  • 测试用例文件不会参与正常源码编译,不会被包含到可执行文件中。
  • 测试用例文件使用 go test 指令来执行,没有也不需要 main() 作为函数入口。所有在以_test结尾的源码内以Test开头的函数会自动被执行。
  • 测试用例可以不传入 *testing.T 参数。

除了构建标志之外,'go test'本身处理的标志是:

  • -args传递命令行的其余部分(-args之后的所有内容)测试二进制文件,未解释和未更改。因为此标志占用命令行的其余部分,包列表(如果存在)必须出现在此标志之前。

  • -C 将测试二进制文件编译为pkg.test但不运行它(其中pkg是包的导入路径的最后一个元素)。可以使用-o标志更改文件名。

  • -exec xprog 使用xprog运行测试二进制文件。行为与以下相同在'go run'。有关详细信息,请参阅“go help run”。

  • -i 安装与测试相关的包。不要运行测试。

  • -json 将测试输出转换为JSON。有关编码详细信息,请参阅“go doc test2json”。

  • -o file 将测试二进制文件编译为指定文件。测试仍然运行(除非指定了-c或-i)。

14.go tool

用法:go tool [-n] command [args...]

  • -n 标记也用于打印流程中执行的命令,但不会取消这些命令的执行

15.go version

显示go的版本

16.go vet

用法:go vet [-n] [-x] [build flags] [vet flags] [packages]

Vet在导入路径命名的包上运行Go vet命令。

  • -n 打印将要执行的命令。
  • -x 执行时打印命令。

17.go mod

版本管理