01
概念
在 Go 语言中,为了方便工程师写程序,提供了一些内置命令行工具,例如 fmt 可以格式化代码,统一代码风格;vet 检测代码的常见错误;build 编译代码,生成可执行程序;run 编译并立即执行可执行程序......
02
包的下载 get
在 Go 程序实际项目开发中,通常我们会导入一些三方包,通过使用关键字 import 和包的导入路径。不过这些包需使用 go get 下载,使用 go get 完成包的下载后,它会构建并安装。
go get 命令还有一些子命令,比如 -d、-f、-t、-u... 如果使用子命令 -u,go get 会将它访问的所有包(包括依赖项)更新到最新版本,然后再构建和安装。如果不使用子命令 -u,直接使用 go get 下载包时,如果本地已存在要下载的包,将会直接使用本地已存在的包。
子命令 |
描述 |
-d |
仅下载,不安装 |
-f |
和 -u 配合,强制更新,不检查是否过期 |
-t |
下载测试代码所需的依赖包 |
-u |
更新包,包括他们的依赖项 |
-v |
输出详细信息 |
insecure |
使用 http 等非安全协议 |
03
包的编译
- build
go build 如果没有提供参数,会默认使用当前目录作为参数。还可以使用指定目录编译,可以使用导入路径或一个相对目录名,目录必须以 “.” 或 “..” 开头。go build 默认每次都会重新编译除标准库以外的所有依赖包。
交叉编译:
通常我们在 Windows 或 Mac OS 操作系统平台下开发,但是服务器一般是 Linux 系统,在一个平台下编译出其它平台可以运行的可执行文件,就需要使用交叉编译。不过自从 Go1.5 版本开始实现自举后,交叉编译也变得更加方便,只需要使用 GOOS、GOARCH 环境变量指定目标平台和架构。
条件编译:
在实际项目开发中,可能有些文件是针对特定的平台和架构开发的,在编译过程中,也需要根据平台和架构的条件进行编译。
条件编译有三种方式,分别是:在文件名中以下划线分隔添加 GOOS 和 GOARCH,或者二者选其一;在源码文件中,package 包声明前面添加 build 指令(它是文档注释),并且与 package 包声明之间空一行,多条 build 指令表示 AND 条件,单条指令中,空格表示 OR 条件,逗号表示 AND,感叹号表示 NOT;使用 go build 的子命令 -tags 指定预定义的 build 指令,多个自定义指令用空格分隔。
- run
go run 实际上将 go build 编译并生成可执行程序,然后执行可执行程序,两个步骤合为一个步骤。从而可以节省一些开发时间。 - vet
vet 命令可以帮助开发人员检测代码的常见错误,可以节省开发时间。vet 可以检测的错误分别是,Printf 类函数调用时,类型匹配错误的参数;定义常用的方法时,方法签名的错误;错误的结构标签;没有指定字段名的结构字面量。 - clean
clean 命令可以删除编译生成的可执行文件。通常用于将源码发布到代码库时,防止可执行文件也发布到代码库。
04
安装 install
install 和 build 类似,区别在于 install 会保存每一个包的编译代码和命令,会将编译结果保存到 pkg 和 bin 目录。还有一个重要的区别是 install 支持增量编译,对于没有改变的包和命令会直接链接 pkg 目录中的静态包,不会重新编译,加快编译速度。
05
格式化 fmt
fmt 命令可以帮助开发人员自动格式化指定的源码文件并保存,建议养成在保存文件或提交到代码库之前执行 go fmt 命令的习惯。
06
测试 test
go test 命令在「Go 语言学习之测试」章节介绍过,这里不再赘述。
07
包的查询 list
list 命令行工具可以获取包的信息,go list 包导入路径,可以判断包是否存在于工作空间中,如果存在则输出它的导入路径;go list ... ,可以查询工作空间中的所有包;go list dir/...,可以查询指定目录中的所有包;go list ...xml...,可以模糊查询出相关的所有包;以上方式仅是获取包的导入路径,go list 还可以使用子命令 -json 获取包的完整元数据,使用子命令 -f 指定输出格式。
08
包的文档化
- doc
go doc 命令行工具可以输出文档注释,参数可以是包名,包成员,方法名。 - godoc
godoc 命令行工具可以提供一个 HTML 页面来浏览文档注释。