TURING 图灵原创 00 Go语言编程 The Go Programming Language 许式伟吕桂华等编著 人民邮电出版社 POSTS & TELECOM PRESS cofdrer(sopoldion@live.com)专享尊重版权
图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
本书十生云存储团队的以下人员执笔:许式伟、品桂华、徐立、韩拓、宋云峰、袁晓沛、徐一昕等、除以上人员外,李婧、何李石、梁涛、李伟、冯立元、周涛等人也为本书的顺利出版出了很多力,由于篇幅所限,没法列出,在此一并致谢。许式伟七牛云存储CEO,曾任盛大创新院资深研究员、金山软件技术总监、WPSOffice2005首席架构师。开源爱好者,发布过包括WINXTPL等十余个C++开源项目,拥有超过15年的C/C++开发经验。在接触Go语言后即可被其大道至简、少即是多的设计暂哲学所倾倒。七牛云存储是国内第个吃螃蟹的团队,核心服务完全采用GO语言实现。吕桂华七牛云存储联合创始人,曾在金山软件,盛大游戏等公司担任架构师和部门经理等职务,在企业级系统和大型网游平台领域有较多涉猎。拥有十余年的C/C++大型项目开发经验,也曾在Java和.NET平台上探索多年。同样被Go语言的魅力所吸引而不可自拔,希望能为推广这门优秀的语言尽自己的绵薄之力。专享尊重版权O
图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
前言:为什么我们需要一门新语言编程语言已经非常多,偏性能敏感的编译型语言有C、C++、Java、C#、Delphi和Objective-C等,偏快速业务开发的动态解析型语言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特定领域的语言有Erlang、R和MATLAB等,那么我们为什么需要Go这样一门新语言呢?在2000年前的单机时代,C语言是编程之王。随着机器性能的提升、软件规模与复杂度的提高,Java逐步取代了C的位置。尽管看起来Java已经深获人心,但Java编程的体验并未尽如人意。历年来的编程语言排行榜(如图0-1所示)显示,Java语言的市场份额在逐步下跌,并趋近于C语言的水平,显示了这门语言后劲不足。Tiobe编程语言排行榜27.458Mava语言)时间PvthonJavascrin图0-1编程语言排行榜Go语言官方自称,之所以开发Go语言,是因为“近10年来开发程序之难让我们有点沮丧”。这一定位暗示了Go语言希望取代C和Java的地位,成为最流行的通用开发语言。Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于①数据来源:http:/www.tiobe.com/index.php/content/paperinfo/tpci/index.html。图灵社区会员soooldier(soooldier@live.com)专享尊重版权
前言:为什么我们需要一门新语言 1 1 2 3 4 5 9 6 7 8 前言:为什么我们需要一门新语言 编程语言已经非常多,偏性能敏感的编译型语言有 C、C++、Java、C#、Delphi和Objective-C 等,偏快速业务开发的动态解析型语言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特 定领域的语言有Erlang、R和MATLAB等,那么我们为什么需要 Go这样一门新语言呢? 在2000年前的单机时代,C语言是编程之王。随着机器性能的提升、软件规模与复杂度的提 高,Java逐步取代了C的位置。尽管看起来Java已经深获人心,但Java编程的体验并未尽如人意。 历年来的编程语言排行榜(如图0-1所示)显示,Java语言的市场份额在逐步下跌,并趋近于C语 言的水平,显示了这门语言后劲不足。 图0-1 编程语言排行榜① Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难让我们有点沮丧”。 这一定位暗示了Go语言希望取代C和Java的地位,成为最流行的通用开发语言。 Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于 —————————— ① 数据来源:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html。 Tiobe编程语言排行榜 时间 所占的百分比( %) Java语言 C语言 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
2前言:为什么我们需要一门新语言C++,将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为C++真的没啥好学的,值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也要足够简单!那么,互联网时代的C语言需要考虑哪些关键问题呢?首先,并行与分布式支持。多核化和集群化是互联网时代的典型特征。作为一个互联网时代的C语言,必须要让这门语言操作多核计算机与计算机集群如同操作单机一样容易。其次,软件工程支持。工程规模不断扩大是产业发展的必然趋势。单机时代语言可以只关心问题本身的解决,而互联网时代的C语言还需要考虑软件品质保障和团队协作相关的话题。最后,编程哲学的重塑。计算机软件经历了数十年的发展,形成了面向对象等多种学术流派。什么才是最佳的编程实践?作为互联网时代的C语言,需要回答这个问题。接下来我们来聊聊Go语言在这些话题上是如何应对的。并发与分布式多核化和集群化是互联网时代的典型特征,那语言需要哪些特性来应对这些特征呢?第一个话题是并发执行的“执行体”。执行体是个抽象的概念,在操作系统层面有多个概念与之对应,比如操作系统自已掌管的进程(process)进程内的线程(thread)以及进程内的协程(coroutine,也叫轻量级线程)。多数语言在语法层面并不直接支持协程,而通过库的方式支持的协程的功能也并不完整,比如仅仅提供协程的创建、销毁与切换等能力。如果在这样的协程中调用一个同步IO操作,比如网络通信、本地文件读写,都会阻塞其他的并发执行协程,从而无法真正达到协程本身期望达到的目标。Go语言在语言级别支持协程,叫goroutine。Go语言标准库提供的所有系统调用(syscall)操作,当然也包括所有同步IO操作,都会出让CPU给其他goroutine,这让事情变得非常简单。我们对比一下Java和Go,近距离观摩下两者对“执行体”的支持。为了简化,我们在样例中使用的是Java标准库中的线程,而不是协程,具体代码如下:public class MyThread implements Runnable (string arg;public MyThread(String a) (arg =a;1public void run()(//.1public static void main(string[] args)(new Thread(new MyThread("test")).start();1/...1图灵社区会员soooldier(soooldier@live.com)专享尊重版权
2 前言:为什么我们需要一门新语言 C++,将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为C++ 真 的没啥好学的,值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也要 足够简单! 那么,互联网时代的C语言需要考虑哪些关键问题呢? 首先,并行与分布式支持。多核化和集群化是互联网时代的典型特征。作为一个互联网时代 的C语言,必须要让这门语言操作多核计算机与计算机集群如同操作单机一样容易。 其次,软件工程支持。工程规模不断扩大是产业发展的必然趋势。单机时代语言可以只关心 问题本身的解决,而互联网时代的C语言还需要考虑软件品质保障和团队协作相关的话题。 最后,编程哲学的重塑。计算机软件经历了数十年的发展,形成了面向对象等多种学术流派。 什么才是最佳的编程实践?作为互联网时代的C语言,需要回答这个问题。 接下来我们来聊聊Go语言在这些话题上是如何应对的。 并发与分布式 多核化和集群化是互联网时代的典型特征,那语言需要哪些特性来应对这些特征呢? 第一个话题是并发执行的“执行体”。执行体是个抽象的概念,在操作系统层面有多个概念 与之对应,比如操作系统自己掌管的进程(process)、进程内的线程(thread)以及进程内的协程 (coroutine,也叫轻量级线程)。多数语言在语法层面并不直接支持协程,而通过库的方式支持的 协程的功能也并不完整,比如仅仅提供协程的创建、销毁与切换等能力。如果在这样的协程中调 用一个同步IO操作,比如网络通信、本地文件读写,都会阻塞其他的并发执行协程,从而无法真 正达到协程本身期望达到的目标。 Go语言在语言级别支持协程,叫goroutine。Go语言标准库提供的所有系统调用(syscall)操 作,当然也包括所有同步IO操作,都会出让CPU给其他goroutine,这让事情变得非常简单。我们 对比一下Java和Go,近距离观摩下两者对“执行体”的支持。 为了简化,我们在样例中使用的是Java标准库中的线程,而不是协程,具体代码如下: public class MyThread implements Runnable { String arg; public MyThread(String a) { arg = a; } public void run() { // . } public static void main(String[] args) { new Thread(new MyThread("test")).start(); // . } 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权
前言:为什么我们需要一门新语言3J相同功能的代码,在Go语言中是这样的:func run(arg string) (...子func main()(go run("test")+..1对比非常鲜明。我相信你已经明白为什么Go语言会叫Go语言了:Go语言献给这个时代最好的礼物,就是加了go这个关键字。当然也有人会说,叫Go语言是因为它是Google出的。好吧,这也是个不错的闲聊主题。第二个话题是“执行体间的通信”。执行体间的通信包含几个方式:口执行体之间的互斥与同步口执行体之间的消息传递先说“执行体之间的互斥与同步”。当执行体之间存在共享资源(一般是共享内存)时,为保证内存访问逻辑的确定性,需要对访问该共享资源的相关执行体进行互斥。当多个执行体之间的逻辑存在时序上的依赖时,也往往需要在执行体之间进行同步。互与同步是执行体间最基础的交互方式。多数语言在库层面提供了线程间的互斥与同步支持,那么协程之间的互斥与同步呢?,不好意思,没有。事实上多数语言标准库中连协程都是看不到的。再说“执行体之间的消息传递”。在并发编程模型的选择上,有两个流派,一个是共享内存模型,一个是消息传递模型。多数传统语言选择了前者,少数语言选择后者,其中选择“消息传递模型”的最典型代表是Erlang语言。业界有专门的术语叫“Erlang风格的并发模型”,其主体思想是两点:一是“轻量级的进程(Erlang中“进程’这个术语就是我们上面说的“执行体)”,二是“消息乃进程间通信的唯一方式”。当执行体之间需要相互传递消息时,通常需要基于一个消息队列(messagequeue)或者进程邮箱(processmailbox)这样的设施进行通信。Go语言推荐采用“Erlang风格的并发模型”的编程范式,尽管传统的“共享内存模型”仍然被保留,允许适度地使用。在Go语言中内置了消息队列的支持,只不过它叫通道(channel)。两个goroutine之间可以通过通道来进行交互。软件工程单机时代的语言可以只关心问题本身的解决,但是随着工程规模的不断扩大,软件复杂度的不断增加,软件工程也成为语言设计层面要考虑的重要课题。多数软件需要一个团队共同去完成,在团队协作的过程中,人们需要建立统一的交互语言来降低沟通的成本。规范化体现在多个层面,如:图灵社区会员soooldier(soooldier@live.com)专享尊重版权
前言:为什么我们需要一门新语言 3 1 2 3 4 5 9 6 7 8 } 相同功能的代码,在Go语言中是这样的: func run(arg string) { // . } func main() { go run("test") . } 对比非常鲜明。我相信你已经明白为什么Go语言会叫Go语言了:Go语言献给这个时代最好 的礼物,就是加了go这个关键字。当然也有人会说,叫Go语言是因为它是Google出的。好吧, 这也是个不错的闲聊主题。 第二个话题是“执行体间的通信”。执行体间的通信包含几个方式: 执行体之间的互斥与同步 执行体之间的消息传递 先说“执行体之间的互斥与同步”。当执行体之间存在共享资源(一般是共享内存)时,为 保证内存访问逻辑的确定性,需要对访问该共享资源的相关执行体进行互斥。当多个执行体之间 的逻辑存在时序上的依赖时,也往往需要在执行体之间进行同步。互斥与同步是执行体间最基础 的交互方式。 多数语言在库层面提供了线程间的互斥与同步支持,那么协程之间的互斥与同步呢?呃,不 好意思,没有。事实上多数语言标准库中连协程都是看不到的。 再说“执行体之间的消息传递”。在并发编程模型的选择上,有两个流派,一个是共享内存 模型,一个是消息传递模型。多数传统语言选择了前者,少数语言选择后者,其中选择“消息传 递模型”的最典型代表是Erlang语言。业界有专门的术语叫“Erlang风格的并发模型”,其主体思 想是两点:一是“轻量级的进程(Erlang中‘进程’这个术语就是我们上面说的‘执行体’)”,二 是“消息乃进程间通信的唯一方式”。当执行体之间需要相互传递消息时,通常需要基于一个消 息队列(message queue)或者进程邮箱(process mail box)这样的设施进行通信。 Go语言推荐采用“Erlang风格的并发模型”的编程范式,尽管传统的“共享内存模型”仍然 被保留,允许适度地使用。在Go语言中内置了消息队列的支持,只不过它叫通道(channel)。两 个goroutine之间可以通过通道来进行交互。 软件工程 单机时代的语言可以只关心问题本身的解决,但是随着工程规模的不断扩大,软件复杂度的 不断增加,软件工程也成为语言设计层面要考虑的重要课题。多数软件需要一个团队共同去完 成,在团队协作的过程中,人们需要建立统一的交互语言来降低沟通的成本。规范化体现在多 个层面,如: 图灵社区会员 soooldier(soooldier@live.com) 专享 尊重版权