Golang具有一套可以构建和处理go源代码的程序,作为命令行工具,这些程序也并非直接运行,而是由go程序调用。运行这些程序最常见的方式是作为go程序的子命令,例如 go fmt,该命令的运行方式是由go程序使用适合于包级处理的参数调用底层二进制文件,对go源代码的完整包进行操作;这些程序也可以作为独立的二进制文件运行,使用go tool子命令(如go tool cgo)使用未修改的参数;某些命令(如pprof)只能通过go tool子命令访问。go命令行作为日常开发的工具,能大大方便编译、调试、诊断程序性能等工作,本文是对常见go命令行工具使用的汇总
1 go命令
go命令管理go源代码并运行此处列出的其他命令。在终端输入go,会打印出如下信息
常用命令详解
启动错误报告 运行go bug
命令,Bug打开默认浏览器并启动新的Bug报告,报告包括有用的系统信息
编译包和依赖项
编译go文件
build compile packages and dependencies go build [-o output] [-i] [build flags] [packages] # 跨平台编译 env GOOS=linux GOARCH=amd64 go build
build编译由导入路径命名的包及其依赖项,但不安装编译结果。如果build的参数是来自单个目录的.go文件列表,则build会将它们视为指定单个包的源文件列表;编译包时,build将忽略以"_test.go"结尾的文件
在编译单个main包时,build将生成的可执行文件写入以第一个源文件(go build ed.go rx.go 输出的二进制文件名为 ‘ed’ 或 ‘ed.exe’)或源代码目录(go build unix/sam 输出的二进制文件名为 ‘sam’ 或 ‘sam.exe’)命名的输出文件(写入Windows可执行文件时会添加.exe后缀);编译多个包或单个非main包时,build会编译包,但会丢弃生成的对象,仅用于检查包是否可编译
删除对象文件和缓存文件 用法如下
go clean [clean flags] [build flags] [packages]
clean从包源目录中删除对象文件。go命令在一个临时目录中构建大多数对象,因此go clean主要关注其他go工具或通过手动调用go build
留下的对象文件
go clean
展示包或符号的文档 用法
go doc [-u] [-c] [package|[package.]symbol[.methodOrField]] go doc <pkg> go doc <sym>[.<methodOrField>] go doc [<pkg>.]<sym>[.<methodOrField>] 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中New函数的文档 go doc text/template.new 一个参数,展示text/template中New函数的文档 go doc text/template new 两个参数,展示text/template中New函数的文档
go doc
打印go环境信息 用法
go env [-json] [-u] [-w] [var ...]
默认情况下,env将信息打印为shell脚本(在windows上,是批处理文件)。如果一个或多个变量名作为参数给定,env将在其自己的行上打印每个命名变量的值
go env
更新包以使用新的APIs 使用方法
go fix [packages]
fix对由导入路径命名的包运行go fix命令。fix查找使用旧api的go程序,并重写它们以使用新的api; 更新到新的go版本后,fix将帮助您对程序进行必要的更改。使用
go tool fix [-r name,...] [path ...]
如果没有显式路径,fix将读取标准输入并将结果写入标准输出; 如果命名路径是一个文件,fix会就地重写命名文件; 如果命名路径是一个目录,fix重写该目录中的所有.go文件树
gofmt(重新格式化)源码包
类似于C中的lint, 统一代码风格和排版
常用命令如: go fmt
fmt gofmt (reformat) package sources go fmt [-n] [-x] [packages]
fmt在由导入路径命名的包上运行命令go fmt -l -w
,它打印被修改文件的名称
-n标志打印将要执行的命令; -x标志在执行命令时打印命令
要了解更多关于gofmt细节可以运行命令go doc cmd/gofmt
通过处理源码生成go文件 使用方法
go generate [-run regexp] [-n] [-v] [-x] [build flags] [file.go... | packages]
生成(必须显示运行)由现有文件中的指令描述的运行命令。这些命令可以运行任何进程,但其意图是创建或更新go源文件。它还接受标准的构建标志,包括-v,-n和-x: -v标志在处理过程中打印包和文件的名称; -n标志打印将要执行的命令; -x标志在执行命令时打印命令
将依赖项添加到当前模块并安装它们
用于获取go的第三方包,通常会默认从git repo
上pulI最新的版本
get add dependencies to current module and install them go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]
常用命令如: go get -u github.com/go-sql-driver/mysql (从github上获
取mysq|的driver并安装至本地)
get解析并向当前开发模块添加依赖项,然后构建并安装它们
第一步,要解决添加哪些依赖项 对于每个命名的包或包模式,get必须决定使用相应模块的哪个版本。默认情况下,get会查找最新的标记版本,如v0.4.5或v1.2.3; 如果没有标记的发布版本,get将查找最新的标记的预发布版本,如v0.0.1-pre1; 如果根本没有标记的版本,get将查找最新的已知提交。如果在更高版本(例如,比最新版本更新的预发行版)中还不需要该模块,则get将使用它查找的版本。否则,get将使用当前所需的版本
第二步是下载(如果需要)、构建和安装命名包 如果参数命名的是模块而不是包(因为模块的根目录中没有go源代码),则会跳过该参数的安装步骤,而不会导致构建失败
go get