00-Go工具

0.1. 命令

Go语言常用内置工具的使用方法及参数含义。

Go是一个管理Go源代码的工具。

用法:
	go <命令> [参数]

可选的命令如下:

命令描述中文
bugstart a bug report启动一个Bug报告
buildcompile packages and dependencies编译包和依赖项
cleanremove object files and cached files删除目标文件和缓存文件
docshow documentation for package or symbol显示包或符号的文档
envprint Go environment information打印Go环境信息
fixupdate packages to use new APIs更新包以使用新API
fmtgofmt (reformat) package sources重新格式化源码包
generategenerate Go files by processing source通过处理源生成Go文件
getdownload and install packages and dependencies下载并安装包和依赖项
installcompile and install packages and dependencies编译和安装包和依赖项
listlist packages or modules列出包或模块
modmodule maintenance模块维护
runcompile and run Go program编译并运行Go程序
testtest packages测试包
toolrun specified go tool运行指定的go工具
versionprint Go version打印Go版本
vetreport likely mistakes in packages报告包中可能出现的错误

使用 go help <命令> 来获取更多关于命令的信息。

其他帮助主题:

主题描述中文
buildmodebuild modes编译模式
ccalling between Go and C在GO和C之间调用
cachebuild and test caching编译和测试缓存
environmentenvironment variables环境变量
filetypefile types文件类型
go.modthe go.mod filego.mod文件
gopathGOPATH environment variableGOPATH环境变量
gopath-getlegacy GOPATH go get
goproxymodule proxy protocol模块代理协议
importpathimport path syntax导入路径语法
modulesmodules, module versions, and more模块和模块版本等
module-getmodule-aware go get
packagespackage lists and patterns包列表和模式
testflagtesting flags测试标志
testfunctesting functions测试功能

使用 go help <主题> 来获取更多关于主题的信息。

0.1.1. go build

默认不会编译目标代码包所依赖的那些代码包。如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那么它还是会被编译的

用法:

go build [-o output] [-i] [build flag] [packages]

# 编译导入路径命名的包以及它的依赖项,但是不会安装编译的结果

# 如果编译的参数是.go文件的列表,编译过程将它们作为单个包的一系列源文件

0.1.1.1. 编译单个包

当编译单个main包时,编译输出的结果文件命名如下,(编写windows可执行文件时,以.exe为后缀):

# 同一个main包,对多个源文件编译
go build ed.go rx.go
# 输出结果为 ed 或 ed.exe,以第一个源码文件名为输出文件名

# 同一个main包,对源码目录编译
go build unix/sam
# 输出结果为 sam 或 sam.exe,以源码目录为输出文件名

当编译多个包或一个非main包时,能够编译这些包但会丢弃结果文件,仅用作检查包是否可以编译

在编译包的时候,编译过程会忽略以_test.go结尾的文件

0.1.2. 参数解释

编译时用到的参数标志被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,显示临时工作目录,完成后不删除

0.2. go get

go get命令会自动从一些主流的公用代码库(如GitHub)下载目标代码包,并安装到GOPATH内第一个工作区对应目录中。

如果存在GOBIN环境变量,那么仅包含命令源码文件的代码会被安装到GOBIN指向的目录中。

用法:

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

0.2.1. 参数解释

  • -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子模块。

0.2.2. 修改源码存储路径

当修改存储源码的代码仓库或者代码包的相对路径时,为了让代码包的远程导入路径不受此类变更的影响,可以使用自定义的代码包导入路径。

对代码包的远程导入路径进行自定义:在该代码包中的库源码文件的包声明语句的右侧加入导入注释,如下:

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

上次修改: 25 November 2019