GO语言学习笔记-工具链篇 Study for Go ! Chapter eleven - Tool Chain
持续更新 Go 语言学习进度中 ......
- GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs.com)
- GO语言学习笔记-表达式篇 Study for Go ! Chapter two - Expression - slowlydance2me - 博客园 (cnblogs.com)
- GO语言学习笔记-函数篇 Study for Go ! Chapter three - Function - slowlydance2me - 博客园 (cnblogs.com)
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 嵌入资源)等工作
GO语言学习笔记-工具链篇 Study for Go ! Chapter eleven - Tool Chain的更多相关文章
- GO1.6语言学习笔记3-工具篇(SublimeText 3+GoSublime组合)
选择SublimeText作为开发工具的原因,最最主要的是它够轻巧,搭配GO开发才能有飞一般的感觉.当然作为开发工具之一,Sublime组合工具也提供足够强大的功能. 自动化提示代码 保存的时候自动格 ...
- GO1.6语言学习笔记1-基础篇
一.GO语言优势 可直接编译成机器码,Go编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖 静态类型语言,但是有动态语言的感觉 语言层面支持并发.Goroutine和channel ...
- GO 语言学习笔记--数组切片篇
1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...
- 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- PHP学习笔记之数组篇
摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇 一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...
- c++学习笔记之继承篇
title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...
- 2017-04-21周C语言学习笔记
C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...
随机推荐
- iOS加载动态自定义字体
iOS加载动态自定义字体 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDom ...
- java 是值传递还是引用传递
首先要明白,修改一个对象,可以是 修改对象的属性值,也能使建立新的引用(指向另一个对象)两种情况 值传递 在函数调用的过程中,参数是 变量的副本,就是复制出来的一个对象,函数中无论怎么修改和原来的变量 ...
- 利用python脚本统计和删除redis key
该脚本扫描redis中所有的key,用于分析redis内存数据的key构成,扫描并保存文件,需要python支持redis模块. #!/usr/bin/env python # -*- coding: ...
- sublime Vue、ejs、less、scss高亮展示
sublime中默认不支持ejs.vue.less.scss等文件高亮展示.解决办法可以增加对应插件: 一.安装: 1.打开sublime 2.点击 preferences ->Browse ...
- 使用 GIT Bash Here 打tar包文件
1.进入要被 打包的文件目录下 2.点击 Git Bash Here ---> tar cvf server.tar server/ ok!!!!!!
- Java基础|03.基础语法(2)
Java安全|03.Java基础语法(2) 00x1 单例模式 定义: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一 ...
- 给linux串口,增加登录密码
一.密码更改 1.在linux系统上,输入passwd,输入需要设定的密码,密码文件保存在/etc/passwd里面. 2.把/etc/passwd文件拷贝出来,放到rootfs的etc/目录下,实现 ...
- webpack1.x 打包文件过大优化
1. 图片单独打包 module: { loaders: [ { test: /\.(jpe?g|png|gif|svg)$/, loader: 'url?limit=8192&name=./ ...
- Maven中的DependencyManagement 和 Dependencies
Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式. 通常会在一个组织或者项目的最顶层的父POM 中看到dependencyManagement 元素. 使 ...
- AES加密 php7版本 openssl_encrypt 遇到的坑
与前端对接api ,解密不了前端加密的数据. 问题描述: 1.前端用 cryptojs 加密的 密钥是24位 , 2.后端用的php7的 openssl_encrypt 同密钥来进行解密,发现解密 ...