超级复杂的C++11特性的吹捧报告的鄙视以及最终的目标是具有动态语言的开发速度的同时并要有C/C++编译语言的性能与安全性以及设计网络和多核时代的C语言数据库
Go语言最初由Goole公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛设计发明编程
图 1-1 Go语言基因族谱数组
首先看基因图谱的左边一支。能够明确看出Go语言的并发特性是由贝尔实验室的Hoare于1978年发布的CSP理论演化而来。其后,CSP并发模型在Squeak/NewSqueak和Alef等编程语言中逐步完善并走向实际应用,最终这些设计经验被消化并吸取到了Go语言中。业界比较熟悉的Erlang编程语言的并发编程模型也是CSP理论的另外一种实现。浏览器
再看基因图谱的中间一支。中间一支主要包含了Go语言中面向对象和包特性的演化历程。Go语言中包和接口以及面向对象等特性则继承自Niklaus Wirth所设计的Pascal语言以及其后所衍生的相关编程语言。其中包的概念、包的导入和声明等语法主要来自于Modula-2编程语言,面向对象特性所提供的方法的声明语法等则来自于Oberon编程语言。最终Go语言演化出了本身特有的支持鸭子面向对象模型的隐式接口等诸多特性。缓存
最后是基因图谱的右边一支,这是对C语言的致敬。Go语言是对C语言最完全的一次扬弃,不只仅是语法和C语言有着不少差别,最重要的是舍弃了C语言中灵活可是危险的指针运算。并且,Go语言还从新设计了C语言中部分不太合理运算符的优先级,并在不少细微的地方都作了必要的打磨和改变。固然,C语言中少便是多、简单直接的暴力编程哲学则被Go语言更完全地发扬光大了(Go语言竟然只有25个关键字,sepc语言规范还不到50页))。安全
Go语言其它的一些特性零散地来自于其余一些编程语言;好比iota语法是从APL语言借鉴,词法做用域与嵌套函数等特性来自于Scheme语言(和其余不少编程语言)。Go语言中也有不少本身发明创新的设计。好比Go语言的切片为轻量级动态数组提供了有效的随机存取的性能,这可能会让人联想到链表的底层的共享机制。还有Go语言新发明的defer语句(Ken发明)也是神来之笔。性能优化
Go 语言有一个吉祥物,在会议、文档页面和博文中,大多会包含下图所示的 Go Gopher,这是才华横溢的插画家 Renee French 设计的,她也是 Go 设计者之一 Rob Pike 的妻子网络
摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增长一倍,性能也将提高一倍。 换言之,每一美圆所能买到的电脑性能,将每隔18-24个月翻一倍以上。数据结构
从上面的图表能够看出,近十年单线程性能和处理器频率保持稳定。咱们不能像以前同样把添加更多晶体管当成是解决方案,由于在较小规模上一些量子特性开始出现(如隧道效应),而且由于在一样小的空间里放置更多晶体管的代价很是昂贵,每1美圆能够添加的晶体管数量开始降低。并发
制造商开始从其余方面提升处理器的性能:
但上述解决方案也有其自身的局限性。由于成本缘由咱们不能无限制的为计算机添加内核,也没法无限制的添加缓存来提升性能,由于缓存越大,取值的性能越低。
咱们没有办法在硬件上一直取得突破,咱们须要提升软件的性能或者说咱们须要高性能的软件。
如上所述,硬件制造商正在为处理器添加愈来愈多的内核以提升性能。全部数据中心都在这些处理器上运行,更重要的是,今天的应用程序使用多个微服务来维护数据库链接,消息队列和维护缓存。所以,开发的软件和编程语言应该能够轻松地支持并发性,而且应该可以随着CPU核心数量的增长而可扩展。
可是,大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。虽然一些编程语言的框架在不断地提升多核资源使用效率,例如 Java 的 Netty 等,但仍然须要开发人员花费大量的时间和精力搞懂这些框架的运行原理后才能熟练掌握。
Go于2009年发布,当时多核处理器已经上市。Go语言在多核并发上拥有原生的设计优点,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。
不少公司,特别是中国的互联网公司,即将或者已经完成了使用 Go 语言改造旧系统的过程。通过 Go 语言重构的系统能使用更少的硬件资源得到更高的并发和I/O吞吐表现。充分挖掘硬件设备的潜力也知足当前精细化运营的市场大环境。
Go语言的并发是基于 goroutine
的,goroutine
相似于线程,但并不是线程。能够将 goroutine
理解为一种虚拟线程。Go 语言运行时会参与调度 goroutine
,并将 goroutine
合理地分配到每一个 CPU 中,最大限度地使用CPU性能。开启一个goroutine
的消耗很是小(大约2KB的内存),你能够轻松建立数百万个goroutine
。
goroutine
的特色:
goroutine
具备可增加的分段堆栈。这意味着它们只在须要时才会使用更多内存。goroutine
的启动时间比线程快。goroutine
原生支持利用channel安全地进行通讯。goroutine
共享数据结构时无需使用互斥锁Go语言学习曲线平缓、简单易学,同时,Go语言被称为”21世纪的C语言”。Go语言的编码风格相似于C语言,其又在C语言的基础上进行了大幅度简化
Go语言提供了本身的一套格式化工具”go fmt”,一些Go语言的编辑器或者开发环境在保存时,都会自动经过格式化工具进行对代码格式化,这样就保证了不一样开发者提交的代码具备统一的格式,从而提升了代码的可读性
Go语言实现了开发效率和运行效率的完美结合,拥有解释型语言的开发速度和编译型语言的运行速度