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