Go命令
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 | go doc <pkg> |
此参数列表中与参数匹配的第一个项目是其文档打印出来。但是,如果参数以大写字母开头
字母假定在当前目录中标识符号或方法。
对于包,扫描的顺序是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 | go doc json.Decoder.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
版本管理