5

GO语言学习笔记-工具链篇 Study for Go ! Chapter eleven - Tool Chain - slowlydanc...

 1 year ago
source link: https://www.cnblogs.com/slowlydance2me/p/17198530.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

持续更新 Go 语言学习进度中 ......

2023-03-14 GO语言学习笔记 系列部分😀 已完结!!

对于刚刚接触 golang 来说,经过这段时间的学习,对于 GO这门语言已经有了初步的认识。

博主接下来会继续学习 golang 的更多内容,持续更新中......

Study for Go ! Chapter eleven - Tool Chain

  • 可从官网直接下载编译好的开发包,或者按照一下步骤自行编译开发环境

  • 自 Golang 1.5 实现自举 ( bootstrapping )以后,我们就不得不保留两个版本的 Go 环境。对于初学者而言建议先下载 C 版本的 1.4,用 GCC 完成编译

    自举是指用编译的目标语言编写其编译器,简单点就是说 用 Go 语言编写 Go 编译器,请提前安装 gcc、gdb、binutils 等工具,本书中的很多内容都会用到它们

    接下来下载 Go 1.6 源码,并使用 Go 1.4 编译

    当开发包编译和部署完成,剩下的就是创建工作空间,并设置环境变量

( 以下为常用内置工具的使用方法及参数含义 )

  • go build

    • 此命令默认每次都会重新编译除标准库以外的所有依赖包

  • go install

    • 和 build 参数相同,但会将编译结果安装到 bin 、pkg 目录。最关键的是, go install 支持增量编译,在没有修改的情况下,会直接链接 pkg 目录中的静态包

    • 编译器用 buildid 检查文件清单和导入依赖,对比现有静态库和所有源文件修改时间来判断源码是否变化,以此来决定是否需要对包进行重新编译。至于 buildid 算法,实现起来很简单:将包的全部文件名,运行时版本号,所有导入的第三方包信息 ( 路径、buildid )数据合并后哈希

  • go get

    • 将第三方包下载 ( check out )到 GOPATH 列表的第一个工作空间。默认不会检查更新,需使用 ” -u “ 参数

  • go env

    • 显示全部或者指定环境参数

  • go clean

    • 清理工作目录,删除编译和安装遗留的目标文件

  • 编译并不仅仅时执行 ” 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 预编译指令那么方便,但是基于文件的组织方式更便于维护

  1. 方法一:将平台和架构信息添加到主文件名末尾

    • 编译器会选择对应的源码文件进行编译,在标准库里可以看到很多类似的文件名

  2. 方法二:使用 build 编译指令

    • 与用文件名区分多版本类似,build 编译指令告知编译器:当前源码文件只能用于指定环境。它一样可用来区分多版本,且控制指令更加丰富和灵活

    • 可以添加多条 build 指令,表示多个 AND 条件。在单一指令里,空格表示 OR 条件,逗号表示 AND ,感叹号表示 NOT

    • 除了 GOOS、GOARCH 外,可用条件还有编译器、版本号

  3. 方法三:使用自定义 tag 指令

    • 除预定义build 指令外,也可通过命令行 tags 参数传递自定义指令

  • 简单点说,就是用 go generate 命令扫描源码文件、找出所有 ” go:generate “ 注释,提取其中的命令并执行

    • 命令必须放在.go 源文件中

    • 命令必须以 ” //go:generate “ 开头(双斜线后不能有空格)

    • 每个文件可有多条 generate 指令

    • 命令支持环境变量

    • 必须显示执行 go generate 命令

    • 按文件名顺序提取命令并执行

    • 串行执行,出错后终止后续命令的执行

  • 这种设计的初衷是为包开发者准备的,可用其完成一些自动处理命令。比如在发布是,清理掉一些包用户不会使用的测试代码。除此之外,还可用来完成基于模板生成代码 (类似泛型功能),或将资源文件转化为源码 (.resx 嵌入资源)等工作

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK