Golang之初探

什么是Go语言

Go语言介绍

产生背景:

超级复杂的C++11特性的吹捧报告的鄙视以及最终的目标是具有动态语言的开发速度的同时并要有C/C++编译语言的性能与安全性以及设计网络和多核时代的C语言数据库


Go语言之父

Go语言最初由Goole公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛设计发明编程

  1. Robert Griesemer:参与开发 Java HotSpot 虚拟机,对语言设计有深刻的认识,并负责 Chrome 浏览器和 Node.js 使用的 Google V8 JavaScript 引擎的代码生成部分
  2. Ken Thompson:贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,在 20 世纪 70 年代,设计并实现了最初的 UNIX 操做系统,仅从这一点说,他对计算机科学的贡献怎么强调都不过度。他还与 Rob Pike 合做设计了 UTF-8 编码方案
  3. Rob Pike:Go 语言项目总负责人,贝尔实验室 Unix 团队成员,除帮助设计 UTF-8 外,还帮助开发了分布式多用户操做系统 Plan 9,Inferno 操做系统和 Limbo 编程语言,并与人合著了《The Unix Programming Environment》,对 UNIX 的设计理念作了正统的阐述


Go的起源

  1. Go起源于2007年,2008年中期,语言的大部分特性设计已经完成,并开始着手实现编译器和运行时,大约在这一年Russ Cox做为主力开发者加入。到了2010年,Go语言已经逐步趋于稳定。同年9月,Go语言正式发布并开源了代码。
  2. Go语言不少时候被描述为“类C语言”,或者是“21世纪的C语言”。而且从各类角度看,Go语言确实是从C语言继承了类似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想,还有完全继承和发扬了C语言简单直接的暴力编程哲学等。下图是《Go语言圣经》中给出的Go语言的基因图谱,咱们能够从中看到有哪些编程语言对Go语言产生了影响。

图 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是解释型语言?仍是编译型语言?

  1. GO语言是编译型语言,经过使用编译器将源代码编译成二进制文件,在编译过程当中,由编译器检查错误、性能优化及编译到不一样平台的二进制文件,
  2. 建立GO语言程序执行步骤以下
    • 建立Go语言程序
    • 保存文件
    • 经过编译器去编译程序
    • 经过编译后,根据本身的需求去生成不一样平台的二进制文件
  3. 解释型语言和编译型语言的简单编译对比

image

 


Go语言吉祥物

Go 语言有一个吉祥物,在会议、文档页面和博文中,大多会包含下图所示的 Go Gopher,这是才华横溢的插画家 Renee French 设计的,她也是 Go 设计者之一 Rob Pike 的妻子网络


世界为何须要Go语言

 

硬件限制:摩尔定律已然失效

摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增长一倍,性能也将提高一倍。 换言之,每一美圆所能买到的电脑性能,将每隔18-24个月翻一倍以上。数据结构


从上面的图表能够看出,近十年单线程性能和处理器频率保持稳定。咱们不能像以前同样把添加更多晶体管当成是解决方案,由于在较小规模上一些量子特性开始出现(如隧道效应),而且由于在一样小的空间里放置更多晶体管的代价很是昂贵,每1美圆能够添加的晶体管数量开始降低。并发

制造商开始从其余方面提升处理器的性能:

  1. 向处理器添加愈来愈多的内核,如四核和八核CPU。
  2. 发明了超线程技术。
  3. 为处理器添加了更多缓存以提升性能。

但上述解决方案也有其自身的局限性。由于成本缘由咱们不能无限制的为计算机添加内核,也没法无限制的添加缓存来提升性能,由于缓存越大,取值的性能越低。

咱们没有办法在硬件上一直取得突破,咱们须要提升软件的性能或者说咱们须要高性能的软件。


Go语言天生支持高并发

如上所述,硬件制造商正在为处理器添加愈来愈多的内核以提升性能。全部数据中心都在这些处理器上运行,更重要的是,今天的应用程序使用多个微服务来维护数据库链接,消息队列和维护缓存。所以,开发的软件和编程语言应该能够轻松地支持并发性,而且应该可以随着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的特色:

  1. goroutine具备可增加的分段堆栈。这意味着它们只在须要时才会使用更多内存。
  2. goroutine的启动时间比线程快。
  3. goroutine原生支持利用channel安全地进行通讯。
  4. goroutine共享数据结构时无需使用互斥锁


Go语言简单易学、容易上手

语法简洁

Go语言学习曲线平缓、简单易学,同时,Go语言被称为”21世纪的C语言”。Go语言的编码风格相似于C语言,其又在C语言的基础上进行了大幅度简化

代码风格统一

Go语言提供了本身的一套格式化工具”go fmt”,一些Go语言的编辑器或者开发环境在保存时,都会自动经过格式化工具进行对代码格式化,这样就保证了不一样开发者提交的代码具备统一的格式,从而提升了代码的可读性

开发效率高

Go语言实现了开发效率和运行效率的完美结合,拥有解释型语言的开发速度和编译型语言的运行速度

相关文章
相关标签/搜索