Go语言常用内置工具的使用方法及参数含义。
Go是一个管理Go源代码的工具。
用法:
go <命令> [参数]
可选的命令如下:
命令 | 描述 | 中文 |
---|---|---|
bug | start a bug report | 启动一个Bug报告 |
build | compile packages and dependencies | 编译包和依赖项 |
clean | remove object files and cached files | 删除目标文件和缓存文件 |
doc | show documentation for package or symbol | 显示包或符号的文档 |
env | print Go environment information | 打印Go环境信息 |
fix | update packages to use new APIs | 更新包以使用新API |
fmt | gofmt (reformat) package sources | 重新格式化源码包 |
generate | generate Go files by processing source | 通过处理源生成Go文件 |
get | download and install packages and dependencies | 下载并安装包和依赖项 |
install | compile and install packages and dependencies | 编译和安装包和依赖项 |
list | list packages or modules | 列出包或模块 |
mod | module maintenance | 模块维护 |
run | compile and run Go program | 编译并运行Go程序 |
test | test packages | 测试包 |
tool | run specified go tool | 运行指定的go工具 |
version | print Go version | 打印Go版本 |
vet | report likely mistakes in packages | 报告包中可能出现的错误 |
使用 go help <命令>
来获取更多关于命令的信息。
其他帮助主题:
主题 | 描述 | 中文 |
---|---|---|
buildmode | build modes | 编译模式 |
c | calling between Go and C | 在GO和C之间调用 |
cache | build and test caching | 编译和测试缓存 |
environment | environment variables | 环境变量 |
filetype | file types | 文件类型 |
go.mod | the go.mod file | go.mod文件 |
gopath | GOPATH environment variable | GOPATH环境变量 |
gopath-get | legacy GOPATH go get | |
goproxy | module proxy protocol | 模块代理协议 |
importpath | import path syntax | 导入路径语法 |
modules | modules, module versions, and more | 模块和模块版本等 |
module-get | module-aware go get | |
packages | package lists and patterns | 包列表和模式 |
testflag | testing flags | 测试标志 |
testfunc | testing functions | 测试功能 |
使用 go help <主题>
来获取更多关于主题的信息。
默认不会编译目标代码包所依赖的那些代码包。如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那么它还是会被编译的。
用法:
go build [-o output] [-i] [build flag] [packages]
# 编译导入路径命名的包以及它的依赖项,但是不会安装编译的结果
# 如果编译的参数是.go文件的列表,编译过程将它们作为单个包的一系列源文件
当编译单个main包时,编译输出的结果文件命名如下,(编写windows可执行文件时,以.exe
为后缀):
# 同一个main包,对多个源文件编译
go build ed.go rx.go
# 输出结果为 ed 或 ed.exe,以第一个源码文件名为输出文件名
# 同一个main包,对源码目录编译
go build unix/sam
# 输出结果为 sam 或 sam.exe,以源码目录为输出文件名
当编译多个包或一个非main包时,能够编译这些包但会丢弃结果文件,仅用作检查包是否可以编译。
在编译包的时候,编译过程会忽略以_test.go
结尾的文件。
编译时用到的参数标志被build、clean、get、install、list、run、test共享。
-a
,强制重新编译所有代码包(含标准库)-i
,安装被编译目标依赖的包-n
,仅显示编译命令,但不执行-o
,只能在编译单个包时使用,指定输出结果名(取代上面两种方式生成的默认名)-p n
,可以并行运行的程序(例如编译命令或测试二进制文件)的数量。默认值是可用的CPU数。-v
,显示待编译包名,通常与-a
搭配使用-x
,显示正在执行的编译命令asmflag
,传递给asm的参数buildmode mode
,编译模式compiler name
,要使用的编译器名称(如运行时编译器gccgo或gc)gccflags
,传递给gcc编译器或链接器的参数-gcflags
,传递给编译器的参数installsuffix suffix
,在代码包安装目录名称中使用的后缀,以便将输出与默认编译分开-ldflags
,传递给链接器的参数linkshared
,链接使用-buildmode=shared
创建的共享库-mod mode
,下载模块来使用(readonly或vendor)pkgdir dir
,从dir安装并加载所有的包(如使用非标准编译时,使用该参数将生成的包保存在单独的位置)masn
,启动与内存清理程序的互操作(仅支持amd64,clang/LLVM作为C编译器)-race
,启动数据竞争检查(仅支持amd64)tags
, 以空格分隔的编译标志列表toolexec
,用于调用vet和asm等工具链程序的程序-work
,显示临时工作目录,完成后不删除go get命令会自动从一些主流的公用代码库(如GitHub)下载目标代码包,并安装到GOPATH内第一个工作区对应目录中。
如果存在GOBIN环境变量,那么仅包含命令源码文件的代码会被安装到GOBIN指向的目录中。
用法:
go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages]
-d
,只下载代码包,不安装-f
,仅在设置-u
时有效,强制get -u
不验证代码包是否为源仓库的分支(如果源是原始代码的本地分支,这很有用)-fix
,在下载代码包后先根据当前Go版本执行代码修正工具,然后再进行依赖项解析或编译代码包-insecure
,允许通过非安全的网络协议(如HTTP)下载和安装代码包-t
,同时下载测试所需的代码包-u
,通过网络更新指定的代码包和它的依赖(默认情况下,get使用网络检查出缺失的包,但不使用它来查找现有包的更新)-v
,启用详细进度和调试输出get命令同样支持使用build的参数来控制安装过程。
Go语言官方提供的go get命令是非常基础的,其中并没有提供依赖管理功能。目前GitHub上有很多提供这类功能的第三方工具,比如glide、gb以及官方出品的dep、vgo等,它们在内部大多会直接受用go get。
查看或更新代码包时,查找源端与本地安装的Go版本匹配的分支或标记。 如果本地安装运行版本为“go1”,则搜索名为“go1”的分支或标记。 如果不存在此类版本,则会检索包的默认分支。
当get查看或更新git存储库是,它还会更新存储库引用的任何git子模块。
当修改存储源码的代码仓库或者代码包的相对路径时,为了让代码包的远程导入路径不受此类变更的影响,可以使用自定义的代码包导入路径。
对代码包的远程导入路径进行自定义:在该代码包中的库源码文件的包声明语句的右侧加入导入注释,如下:
package semaphore // import "golang.org/x/sync/semaphore"
这个代码包原来的完整导入路径是github/golang/x/sync/semaphore
,这与实际存储它的网络地址一样,该代码包的源码实际存放在GitHub网站的golang组的sync代码仓库的semaphore目录下。加入导入注释后,用以下命令即可下载并安装该代码包了:
go get golang.org/x/sync/semaphore
在Go语言官网golang.org下的路径
/x/sync/semaphore
并不存放semaphore包的真实地址。称之为代码包的自定义导入路径。
不过,这还是需要在golang.org这个域名背后的服务端程序上,添加一些支持才能使这条命令成功。具体参考这里:https://github.com/hyper0x/go_command_tutorial/blob/master/0.3.md