GO语言学习笔记-工具链篇 Study for Go ! Chapter eleven - Tool Chain
- GO语言学习笔记-函数篇 Study for Go ! Chapter three - Function
 - GO语言学习笔记-数据篇 Study for Go ! Chapter four - Data
 - GO语言学习笔记-方法篇 Study for Go ! Chapter five - Method
 - GO语言学习笔记-接口篇 Study for Go ! Chapter six - Interface
 - GO语言学习笔记-并发篇 Study for Go ! Chapter seven - Concurrency
 - GO语言学习笔记-包结构篇 Study for Go ! Chapter eight - Package Structure
 - GO语言学习笔记-反射篇 Study for Go ! Chapter nine - Reflect
 - GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test
 - GO语言学习笔记-工具链篇 Study for Go ! Chapter eleven - Tool Chain
 
1. 安装
- 
可从官网直接下载编译好的开发包,或者按照一下步骤自行编译开发环境
 - 
自 Golang 1.5 实现自举 ( bootstrapping )以后,我们就不得不保留两个版本的 Go 环境。对于初学者而言建议先下载 C 版本的 1.4,用 GCC 完成编译
自举是指用编译的目标语言编写其编译器,简单点就是说 用 Go 语言编写 Go 编译器,请提前安装 gcc、gdb、binutils 等工具,本书中的很多内容都会用到它们
接下来下载 Go 1.6 源码,并使用 Go 1.4 编译
 
2. 工具
( 以下为常用内置工具的使用方法及参数含义 )
- 
go build
- 
此命令默认每次都会重新编译除标准库以外的所有依赖包
 
 - 
 - 
go install
- 
和 build 参数相同,但会将编译结果安装到 bin 、pkg 目录。最关键的是, go install 支持增量编译,在没有修改的情况下,会直接链接 pkg 目录中的静态包
 - 
编译器用 buildid 检查文件清单和导入依赖,对比现有静态库和所有源文件修改时间来判断源码是否变化,以此来决定是否需要对包进行重新编译。至于 buildid 算法,实现起来很简单:将包的全部文件名,运行时版本号,所有导入的第三方包信息 ( 路径、buildid )数据合并后哈希
 
 - 
 - 
go get
- 
将第三方包下载 ( check out )到 GOPATH 列表的第一个工作空间。默认不会检查更新,需使用 ” -u “ 参数
 
 - 
 - 
go env
- 
显示全部或者指定环境参数
 
 - 
 - 
go clean
- 
清理工作目录,删除编译和安装遗留的目标文件
 
 - 
 
3. 编译
- 
编译并不仅仅时执行 ” go build “ 命令,还有一些需要格外注意的内容
 - 
如习惯使用 GDB 这类调试器,建议编译时添加 -gcflags ” -N -I “ 参数组织优化和内联 ,否则调试时会有各种 ” 找不到 “ 的情况
 - 
而当发布时,参数 -ldflags ” -w -s“ 会让连接器剔除符号表和调试信息,除能减小可执行文件大小外,还可悄悄增加反汇编的难度
 - 
还可借助更专业的工具,对可执行文件进行减肥
 
4. 交叉编译
- 
所谓交叉编译 ( cross compile ),是指在一个平台编译出其他平台所需的可执行文件,这对于 UNIX-like 开发人员很重要,因为我们习惯使用 Mac 或其他桌面环境。
 - 
自 Go 实现自举后,交叉编译变得更方便。只需使用 GOOS、GOARCH 环境变量指定平台和架构就行
 - 
建议使用 go install 命令为目标平台预编译好标准库,避免 go build 每次都须完整编译
 
Attention:
交叉编译不支持 CGO
5. 条件编译
- 
除在代码中使用 runtime.GOOS 进行判断外,编译器本身就支持文件级别的条件编译。虽然没有 C 预编译指令那么方便,但是基于文件的组织方式更便于维护
 
- 
方法一:将平台和架构信息添加到主文件名末尾
- 
编译器会选择对应的源码文件进行编译,在标准库里可以看到很多类似的文件名
 
 - 
 - 
方法二:使用 build 编译指令
- 
与用文件名区分多版本类似,build 编译指令告知编译器:当前源码文件只能用于指定环境。它一样可用来区分多版本,且控制指令更加丰富和灵活
 - 
可以添加多条 build 指令,表示多个 AND 条件。在单一指令里,空格表示 OR 条件,逗号表示 AND ,感叹号表示 NOT
 - 
除了 GOOS、GOARCH 外,可用条件还有编译器、版本号
 
 - 
 - 
方法三:使用自定义 tag 指令
- 
除预定义build 指令外,也可通过命令行 tags 参数传递自定义指令
 
 - 
 
预处理
- 
简单点说,就是用 go generate 命令扫描源码文件、找出所有 ” go:generate “ 注释,提取其中的命令并执行
- 
命令必须放在.go 源文件中
 - 
命令必须以 ” //go:generate “ 开头(双斜线后不能有空格)
 - 
每个文件可有多条 generate 指令
 - 
命令支持环境变量
 - 
必须显示执行 go generate 命令
 - 
按文件名顺序提取命令并执行
 - 
串行执行,出错后终止后续命令的执行
 
 - 
 - 
这种设计的初衷是为包开发者准备的,可用其完成一些自动处理命令。比如在发布是,清理掉一些包用户不会使用的测试代码。除此之外,还可用来完成基于模板生成代码 (类似泛型功能),或将资源文件转化为源码 (.resx 嵌入资源)等工作
 - 
 
本文来自博客园,作者:slowlydance2me,转载请注明原文链接:https://www.cnblogs.com/slowlydance2me/p/17198530.html