1.起源与发展
Go 语言起源 2007 年,并于 2009 年正式对外发布。它从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目,即相关员工利用 20% 的空余时间来参与 Go 语言的研发工作。该项目的三位领导者均是著名的 IT 工程师:Robert Griesemer,参与开发 Java HotSpot 虚拟机;Rob Pike,Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言;Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范。自 2008 年 1 月起,Ken Thompson 就开始研发一款以 C 语言为目标结果的编译器来拓展 Go 语言的设计思想。
- 2007 年 9 月 21 日:雏形设计
- 2009 年 11 月 10日:首次公开发布
- 2010 年 1 月 8 日:当选 2009 年年度语言
- 2010 年 5 月:谷歌投入使用
- 2011 年 5 月 5 日:Google App Engine 支持 Go 语言
- 2015年8月19日,Go 1.5版发布,本次更新中移除了“最后残余的C代码”,里程碑版本。
- 2017年2月17日,Go语言Go 1.8版发布。
- 2017年8月24日,Go语言Go 1.9版发布。
- 2018年2月16日,Go语言Go 1.10版发布。
2.学习方向
区块链研发工程师
区块链的核心思想是去中心化,让每个人都能参加数据库的记录,比如虚拟货币
Go服务端
目前服务器端主要采用C和C++实现,只要是C和C++能做的事情,Go语言就可以实现且做的不错。因为Go的作者Ken Thompson也是C语言的设计者,相当于对C语言设计的部分优化,比如处理日志、数据打包、虚拟机处理等,据说美团后台的流量处理就是采用Go语言编写。Go语言处理和大并发处理的能力非常突出
游戏软件工程师
游戏数据通道会使用Go语言
Golang分布式/云计算软件工程师
盛大云CDN、京东分布式文件系统
3.应用领域
区块链应用
区块链技术简称BT(Blockchain technology)也被称为分布式账本技术,是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录。
后端服务器应用(并发)
美团后台流量支撑程序,支撑主站后台流量(排序、推荐、搜索等),提供负载均衡、cache、容错、按条件分流,统计运行指标(qps、latency)等功能。
仙侠道游戏,包括游戏服务端通讯、逻辑和数据存储等架构。下面推荐davyxu大佬分享的Go语言的游戏服务器底层网络库。
https://github.com/davyxu/cellnet
云计算和云服务开发
盛大云CDN(内容分发网络),包括CDN的调度系统、分发系统、监控系统、短域名服务,CDN内部开放平台、运营报表系统及其他一些小工具等。
PS:2019年参加极棒安全大会,清华大学利用CDN发起DDoS攻击值得安全圈的朋友去学习下,利用分发实现攻击挺有意思的。
京东消息推送云服务(京东云),包括京东分布式文件系统,后台服务采用Go语言实现。
4.Go语言特点
Go语言保证了既能达到静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,Go = C + Python
1)从C语言中继承了很多理念,包括表达式语法、控制结构、基础数据类型、调用参数传值、指针等等,也保留了和C语言一样的编译执行方式及弱化的指针。
package main //go语言指针的使用特点 星号取值 func testPtr(num int) { num = 20 } func main() { }
2) 引入包的概念,用于组织程序结构,Go语言的 一个文件都要归属于一个包,而不能单独存在。比如新建“test.go”文件,需要在一个包main中。
package main //一个go文件需要在一个包中 import “fmt” func sayOK() { fmt.Println(“ok”) }
3) 垃圾回收机制。
内存自动回收,不需要开发人员管理,防止造成内存泄露。
4) 天然并发性能。
从语言层面支持并发,实现简单;goroutine轻量级线程,可实现大并发处理,高效利用多核;基于CPS并发模型(Communicating Sequential Process)实现。
5) 吸收了管道通信机制。
形成Go语言特有的管道channel。通过管道channel可以实现不同的goroute之间的相互通信。
6) 函数可以返回多个值。
//写一个函数实现同时返回多个值 func getSumAndSub(n1 int, n2 int) (int, int) { sum := n1 + n2 //go语言后面不用带分号 sub := n1 - n2 return sum, sub }
7) 新的创新比如切片(slice)、延时执行defer等。
5.关于特性缺失
许多能够在大多数面向对象语言中使用的特性 Go 语言都没有支持,但其中的一部分可能会在未来被支持。
- 为了简化设计,不支持函数重载和操作符重载
- 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
- Go 语言通过另一种途径实现面向对象设计(第 10-11 章)来放弃类和类型的继承
- 尽管在接口的使用方面(第 11 章)可以实现类似变体类型的功能,但本身不支持变体类型
- 不支持动态加载代码
- 不支持动态链接库
- 不支持泛型
- 通过recover和panic来替代异常机制(第 13.2-3 节)
- 不支持断言
- 不支持静态变量
静态编译:就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应静态库(.a或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。 java等
动态编译:是某些程式语言在执行时用来增进效能的方法。 python等
与动态编译的区别
动态编译的可执行文件需要附带一个的动态链接库。在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应静态库(.a或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。
若有收获,就点个赞吧