Go语言编程

当前位置:首页 > 网络编程 > 编程语言与程序设计 > Go语言编程

出版社:人民邮电出版社
出版日期:2012-8
ISBN:9787115290366
作者:许式伟
页数:300页

前言

  为什么我们需要一门新语言  编程语言已经非常多,偏性能敏感的编译型语言有 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。  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(); // ...  }  }  相同功能的代码,在 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之间可以通过通道来进行交互。  软件工程  单机时代的语言可以只关心问题本身的解决,但是随着工程规模的不断扩大,软件复杂度的不断增加,软件工程也成为语言设计层面要考虑的重要课题。多数软件需要一个团队共同去完成,在团队协作的过程中,人们需要建立统一的交互语言来降低沟通的成本。规范化体现在多个层面,如:  ·代码风格规范  ·错误处理规范  ·包管理  ·契约规范(接口)  ·单元测试规范  ·功能开发的流程规范  Go语言很可能是第一个将代码风格强制统一的语言,例如 Go语言要求 public的变量必须以大写字母开头,private变量则以小写字母开头,这种做法不仅免除了public、private关键字,更重要的是统一了命名风格。  另外,Go语言对 { }应该怎么写进行了强制,比如以下风格是正确的:  if expression { ... }  但下面这个写法就是错误的:  if expression { ... }  而C和Java语言中则对花括号的位置没有任何要求。哪种更有利,这个见仁见智。但很显然的是,所有的 Go代码的花括号位置肯定是非常统一的。最有意思的其实还是 Go语言首创的错误处理规范:  f, err := os.Open(filename)  if err != nil { log.Println(“”Open file failed:““, err) return  } defer f.Close() ... // 操作已经打开的 f文件  这里有两个关键点。其一是 defer关键字。 defer语句的含义是不管程序是否出现异常,均在函数退出时自动执行相关代码。在上面的例子中,正是因为有了 defer,才使得无论后续是否会出现异常,都可以确保文件被正确关闭。其二是 Go语言的函数允许返回多个值。大多数函数的最后一个返回值会为 error类型,以在错误情况下返回详细信息。 error类型只是一个系统内置的interface,如下:  type error interface { Error() string }  有了error类型,程序出现错误的逻辑看起来就相当统一。在Java中,你可能这样写代码来保证资源正确释放:  Connection conn = ...;  try { Statement stmt = ...; try {  ResultSet rset = ...; try {  ... // 正常代码 } finally {  rset.close();  } } finally {  stmt.close();  } } finally {  conn.close(); }  完成同样的功能,相应的 Go代码只需要写成这样:  conn := ... defer conn.Close()  stmt := ... defer stmt.Close()  rset := ... defer rset.Close() ... // 正常代码  对比两段代码, Go语言处理错误的优势显而易见。当然,其实 Go语言带给我们的惊喜还有很多,后续有机会我们可以就某个更具体的话题详细展开来谈一谈。  编程哲学  计算机软件经历了数十年的发展,形成了多种学术流派,有面向过程编程、面向对象编程、函数式编程、面向消息编程等,这些思想究竟孰优孰劣,众说纷纭。  C语言是纯过程式的,这和它产生的历史背景有关。 Java语言则是激进的面向对象主义推崇者,典型表现是它不能容忍体系里存在孤立的函数。而 Go语言没有去否认任何一方,而是用批判吸收的眼光,将所有编程思想做了一次梳理,融合众家之长,但时刻警惕特性复杂化,极力维持语言特性的简洁,力求小而精。  从编程范式的角度来说, Go语言是变革派,而不是改良派。对于C++、Java和C#等语言为代表的面向对象( OO)思想体系,Go语言总体来说持保守态度,有限吸收。首先,Go语言反对函数和操作符重载( overload),而C++、Java和C#都允许出现同名函数或操作符,只要它们的参数列表不同。虽然重载解决了一小部分面向对象编程( OOP)的问题,但  同样给这些语言带来了极大的负担。而 Go语言有着完全不同的设计哲学,既然函数重载带来了负担,并且这个特性并不对解决任何问题有显著的价值,那么 Go就不提供它。其次,Go语言支持类、类成员方法、类的组合,但反对继承,反对虚函数( virtual function)和虚函数重载。确切地说, Go也提供了继承,只不过是采用了组合的文法来提供:  type Foo struct { Base ...  }  func (foo *Foo) Bar() { ... }  再次,Go语言也放弃了构造函数( constructor)和析构函数(destructor)。由于Go语言中没有虚函数,也就没有 vptr,支持构造函数和析构函数就没有太大的价值。本着“如果一个特性并不对解决任何问题有显著的价值,那么 Go就不提供它”的原则,构造函数和析构函数就这样被Go语言的作者们干掉了。  在放弃了大量的 OOP特性后,Go语言送上了一份非常棒的礼物:接口( interface)。你可能会说,除了 C这么原始的语言外,还有什么语言没有接口呢?是的,多数语言都提供接口,但它们的接口都不同于 Go语言的接口。  Go语言中的接口与其他语言最大的一点区别是它的非侵入性。在 C++、Java和C#中,为了实现一个接口,你需要从该接口继承,具体代码如下:  class Foo implements IFoo { // Java文法 ... }  class Foo : public IFoo { // C++文法 ... }  IFoo* foo = new Foo;  在Go语言中,实现类的时候无需从接口派生,具体代码如下:  type Foo struct { // Go 文法 ... }  var foo IFoo = new(Foo)  只要Foo实现了接口IFoo要求的所有方法,就实现了该接口,可以进行赋值。 Go语言的非侵入式接口,看似只是做了很小的文法调整,实则影响深远。其一,Go语言的标准库再也不需要绘制类库的继承树图。你只需要知道这个类实现了哪些  方法,每个方法是啥含义就足够了。其二,不用再纠结接口需要拆得多细才合理,比如我们实现了 File类,它有下面这些方法:  前言:为什么我们需要一门新语言  Read(buf []byte) (n int, err error) Write(buf []byte) (n int, err error) Seek(off int64, whence int) (pos int64, err error) Close() error  那么,到底是应该定义一个 IFile接口,还是应该定义一系列的 IReader、IWriter、 ISeeker和ICloser接口,然后让File从它们派生好呢?事实上,脱离了实际的用户场景,讨论这两个设计哪个更好并无意义。问题在于,实现 File类的时候,我怎么知道外部会如何用它呢?  其三,不用为了实现一个接口而专门导入一个包,而目的仅仅是引用其中的某个接口的定义。在Go语言中,只要两个接口拥有相同的方法列表,那么它们就是等同的,可以相互赋值,如对于以下两个接口,第一个接口:  package one  type ReadWriter interface {  Read(buf [] byte) (n int, err error)  Write(buf [] byte) (n int, err error)  }  第二个接口:  package two  type IStream interface {  Write(buf [] byte) (n int, err error)  Read(buf [] byte) (n int, err error)  }  这里我们定义了两个接口,一个叫 one.ReadWriter,一个叫 two.IStream,两者都定义了Read()和Write()方法,只是定义的次序相反。 one.ReadWriter先定义了 Read()再定义 Write(),而two.IStream反之。  在Go语言中,这两个接口实际上并无区别,因为:  ·任何实现了 one.ReadWriter接口的类,均实现了 two.IStream;  ·任何one.ReadWriter接口对象可赋值给 two.IStream,反之亦然;  ·在任何地方使用 one.ReadWriter接口,与使用 two.IStream并无差异。所以在Go语言中,为了引用另一个包中的接口而导入这个包的做法是不被推荐的。因为多引用一个外部的包,就意味着更多的耦合。  除了OOP外,近年出现了一些小众的编程哲学, Go语言对这些思想亦有所吸收。例如, Go语言接受了函数式编程的一些想法,支持匿名函数与闭包。再如, Go语言接受了以 Erlang语言为代表的面向消息编程思想,支持 goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。总体来说, Go语言是一个非常现代化的语言,精小但非常强大。  小结  在十余年的技术生涯中,我接触过、使用过、喜爱过不同的编程语言,但总体而言, Go语言的出现是最让我兴奋的事情。我个人对未来 10年编程语言排行榜的趋势判断如下:  □·Java语言的份额继续下滑,并最终被 C和Go语言超越;  □·C语言将长居编程榜第二的位置,并有望在 Go取代Java前重获语言榜第一的宝座;  □·Go语言最终会取代 Java,居于编程榜之首。  由七牛云存储团队编著的这本书将尽可能展现出 Go语言的迷人魅力。希望本书能够让更多人理解这门语言,热爱这门语言,让这门优秀的语言能够落到实处,把程序员从以往繁杂的语言细节中解放出来,集中精力开发更加优秀的系统软件。  许式伟 2012年3月7日

媒体关注与评论

这本书除了完整介绍Go语言特性之外,还深入剖析了语言实现机制。作为服务器软件开发者和编程语言爱好者,我强烈推荐此书。——李杰,盛大文学首席架构师《Go语言编程》正是这样一份猛料,能够带领越来越多的人了解Go,学习Go,用Go来实现自己的梦想。——何晓杰,国内知名Android研究者,安居客移动事业部高级开发经理《Go语言编程》这本书应当说是作者多年编程经验的沉淀和反思。本书一方面通过展示和分析大量Go语言代码,阐明了Go语言基本的使用方式,另一方面通过和C语言代码进行比较,进一步剖析了语言的内在设计思想,乃至底层实现原理,让各个层次的读者都能从书中汲取到大量的知识,使人读后必有所得。——邢星,Go语言社区积极推动者,39健康网技术部副总监

内容概要

许式伟
七牛云存储CEO,曾任盛大创新院资深研究员、金山软件技术总监、WPS Office 2005首席架构师。开源爱好者,发布过包括WINX、TPL等十余个C++开源项目,拥有超过15年的C/C++开发经验。在接触Go语言后即可被其大道至简、少即是多的设计哲学所倾倒。七牛云存储是国内第一个吃螃蟹的团队,核心服务完全采用Go语言实现。
吕桂华
七牛云存储联合创始人,曾在金山软件、盛大游戏等公司担任架构师和部门经理等职务,在企业级系统和大型网游平台领域有较多涉猎。拥有十余年的C/C++大型项目开发经验,也曾在Java和.NET平台上探索多年。同样被Go语言的魅力所吸引而不可自拔,希望能为推广这门优秀的语言尽自己的绵薄之力。

书籍目录

序 为什么我们需要一门新的语言?
第1章 初识Go语言
1.1 Go语言简史
1.2 语言特性
1.3 “Hello, world!”
1.4 编译环境
1.5 开发工具
1.6 工程管理
1.7 问题追踪和调试
1.8 如何寻求帮助
本章小结
第2章 顺序编程
2.1 变量、常量和类型
2.1.1 变量
2.1.2 常量
2.1.3 类型
2.2 流程控制
2.2.1 条件语句
2.2.2 选择语句
2.2.3 循环
2.2.4 跳转语句
2.3 函数
2.3.1 函数调用
2.3.2 不定参数
2.3.3 多返回值
2.3.4 匿名函数与闭包
2.4 错误处理
2.4.1 error接口
2.4.2 defer
2.4.3 panic和recover
本章小结
第3章 面向对象编程
3.1 类型系统
3.1.1 给类型添加方法
3.1.2 值语义和引用语义
3.2 结构体
3.2.1 初始化
3.2.2 匿名组合
3.2.3 成员可访问性
3.3 接口
3.3.1 其他语言中的接口
3.3.2 非侵入式接口
3.3.3 接口赋值
3.3.4 接口查询
3.3.5 类型查询
3.3.6 Any类型
本章小结
第4章 工程管理
4.1 Go命令行工具
4.2 代码风格
4.3 工程组织
4.4 单元测试
4.5 文档管理
4.6 工程构建
4.7 包的管理与分发
4.8 跨平台开发
4.8.1 Go语言的跨平台能力
4.8.2 交叉编译
4.8.3 Android支持
本章小结
第5章 并发编程
5.1 初识Goroutine
5.1.1 基本用法
5.1.2 Goroutine通信
5.2 Channel
5.2.1 基本用法
5.2.2 关闭
5.2.3 变量的传递
5.2.4 单向Channel
5.2.5 超时处理
5.3 多核并行化
5.4 同步机制
5.4.1 sync包简介
5.4.2 同步锁
5.4.3 Once类型
本章小结
第6章 网络编程
6.1 HTTP编程
6.1.1 客户端编程
6.1.2 开发HTTP服务器
6.2 JSON
6.2.1 JSON简介
6.2.2 编码
6.2.3 解码
6.2.4 未知类型的解码
6.2.5 流式读写
6.3 网站开发
6.3.1 一个最简单的网站
6.3.2 开发一个相册网站
6.3.2.1 新建工程
6.3.2.2 实现网络服务
6.3.2.3 网页模板渲染
6.3.2.4 缓存
6.3.2.5 错误处理
6.3.2.6 防止程序崩溃
6.3.2.7 资源分离
6.3.2.8 重构
6.4 更多资源
本章小结
第7章 进阶话题
7.1 Go语言中的内存管理
7.2 反射
7.3 语言交互性CGO
7.4 链接符号
7.5 Goroutine实现机制
7.6 接口的奥秘
本章小结
第8章 开发工具
8.1 Go语言开发工具
8.2 gEdit
8.3 Goclipse - 使用Eclipse开发和调试Go程序
8.4 VIM
8.5 Nodepad++,Windows上的Go开发环境搭建
8.6 GolangIDE
本章小结
附录 Go语言包参考

编辑推荐

国内第一本Go语言编程书原盛大创新院研究员执笔Go语言领域技术大牛作品作者Go语言开发实战项目帮助您快速入手全新语言

作者简介

这本书从整体的写作风格来说,会以介绍 Go 语言特性为主,示例则尽量采用作者平常的实践,而不是一个没有太大实际意义的语法示范样例。
本书作者背景极强,许式伟为原金山WPS首席架构师、曾是盛大创新院研究员,目前是国内Go语言实践圈子公认的Go语言专家。参与本书写作的几位作者都是实际用Go语言开发的项目的开发人员,有较强的实战经验。
本书以介绍Go语言特性为主,示例则尽量采用作者开发团队平常的实践,内容涉及内存管理(堆和栈)、错误处理、OOP、并发编程等关键话题。 这本书面向的读者是所有打算用Go语言的开发者,主要包括目前使用C、C++、Java、C#的开发人员,甚至一些Python、PHP开发人员也可能转为 Go 程序员。

图书封面


 Go语言编程下载 精选章节试读 更多精彩书评



发布书评

 
 


精彩书评 (总计23条)

  •     基本还可以吧,语言还很通顺!基本把Go 语言 的特点都说出来了!通过本书,可以知道Go 语言来龙去脉,特点等等,感觉Go 也就是多返回值,并行方便一些,别的一些面向对象特性,感觉有点儿怪,可能是C++习惯的缘故,Go 确实实用性 比C++ 强一些,但是本书里面没有Go 关于GUI的编程!就说还没有发展起来呢,它的用处主要在并行服务器方面!
  •     先说缺点:1. 这本书更像是关于go语言主要特性的文章合集。内容上既不全面,也不深入。定位既不是介绍语法基础,也不是介绍Go语言内部实现机制或者某一个特性的深入介绍。2. 对于Go语法介绍既不全面,也不系统,不便于读者掌握Go语言语法。这方面不如《An Introduction to Programming in Go》这本书。3. 例子代码不够简洁,大的例子代码适合作为练习,介绍语言特性还是比较适合用简短的小例子。而且里面有不少错误。比如第83页,给出的Play函数的定义如下:func Play(source, mtype string) {var p Playerswitch mtype {case "MP3":p = &MP3Player{} case "WAV":p = &WAVPlayer{} default: fmt.Println("Unsupported music type", mtype)return}p.Play(source)}但是第85页,调用的地方代码func handlePlayCommand(tokens []string) { if len(tokens) != 2 {fmt.Println("USAGE: play <name>")return}e := lib.Find(tokens[1]) if e == nil {fmt.Println("The music", tokens[1], "does not exist.")return}mp.Play(e.Source, e.Type, ctrl, signal) //调用地方传入了4个参数}第86页给出了程序的执行结果,真不知道程序怎么运行成功的。4. 对于某些深入的主题,未介绍一些关键主题,比如第7章工程管理,未对大型项目如何引用第三方package进行介绍。还有对一些主题应该给出进一步阅读链接,比如第8章开发工具更像是从某个博客文章拷贝下来的。这本书的优点:1. 内容中包含作者实际一些开发经验。2. 一些比较大的例子代码读懂后,对学习Go语言工程化开发比较有帮助。3. 第9章,对Go语言内部实现机制的进阶介绍,显示了作者的功底和深入思考。
  •     书多数部分反复强调一句话go比XX好、优秀,实在的东西写得比较浅,章节跨度优秀大。goroutin select 介绍不足。总的来书,看过之后很失望,无处不在的吹捧模式,让人生厌。对go有很好的期待,就不要看这个书了,真的佷差。我比较喜欢go的oo方式,channel + go比erlang actor,还有一些不便之处,更像是lib,不像erlang的solution。

精彩短评 (总计72条)

  •     用来入门足够了,另外书中有很多代码错误
  •     go入门书籍
  •     一本薄薄的书,我写go的入门书,讲得很好,但是书中部分代码有显而易见的错误,美中不足。
  •     错字和代码错误很多,安全编程一章有凑数之嫌,看过后知道个大概而已
  •     书上的代码错误太多了,简直不忍直视...太不严谨了
  •     除了是中文的,没有其他优点了。很多地方没有讲清楚,到最后还是要重头看英文文档,不管是入门还是进阶都不建议看,推荐直接看英文在线文档https://golang.org/doc/
  •     不痛不痒,第五章和第七章可读
  •     又是一门新语言
  •     远不如 beego 作者写的,代码感觉也有错误
  •     这本书很简洁,主要的部分讲到了,美中不足的一点就是有点马虎,代码错误率太多,而且有些主题没有上下文。个人认为,第一、四、九章是重点,细看之。其余翻一翻,写一写就OK了,第六章也不错,从作者的代码里学到了很多思维,如如何更好的DRI,重构以及闭包处理全局异常。
  •     与经典《XX语言编程》系列的书籍构造一样,没有过多的执着于项目应用,而是专注于介绍语言(传教),膜拜作者,沦为go语言粉。书中虽然有代码不对,不过调试过程也当学习了。
  •     说实话,这本书写得很一般,鉴于许很热衷于开源事业,乐于推动golang发展才给3星。。。说说我的想法吧。。最初,我想买这本书,主要是因为许做了golang的实际开发,我以为会有很多经验分享。事实上。。。反正我是失望很大。。如果你是想看它怎么教你写go语法的,我觉得不怎么适合,网上有本《学习go语言》的书(开源,可以直接下到高清pdf)个人觉得介绍得更有条理,简洁明了,清晰易懂。因为这本说讲语法很不集中,写的有点散乱。有的语法我在别人的代码里看过,但书里貌似没有。如果你是想通过里面的代码学习,我也很不建议。代码质量我不评价,n多例子贴一次就算了,还要两三次的在不同章节贴,这个有点恶心了,本来书就不厚。。。代码最好打包放到网上吧。至于应用,本来go的核心是goroutine,至少我想看的是网络编程和goroutine的结合,不过书中后面的大部分章节都是讲web编程。这个也就算了,关键还说得非常简单。。。标准库的话也基本没介绍多少,tcp大概就三五面,加密就那么两个简单的md5update的例子,至于rpc也是两面。。。至于高级点的部分,和C的交互也是三言两语带过,其他的我就不想说了至于其他的方面,比如语言表述过于口语话,这个我就谅解了。。。暂时还没看到好的...介绍go的书。没事去github上看大牛写的代码吧。。。哎,失望极了好吧,对于这本书来说,我算是高级黑吧,许式伟很热衷开源,这点我还是很敬重的。。 阅读更多 ›
  •     不错的入门书籍,书中的例子只动手写了很少一部分
  •     非常浅显的入门书籍,推荐入门使用。
  •     一般般
  •     书里面的代码有很多错,不过感觉有些内容说得还可以
  •     入门可用
  •     末尾有一些语言原理性的分析,但暂时还看不太懂。默认支持协程和利用管道的通信方式挺有意思。
  •     好玩,不过还是先用go刷100题再考虑拿它做工程吧。。
  •     还不错,值得一看,作为入门必读吧
  •       我在新浪微博、《Go语言编程》一书中下了一个论断:Go语言将超过C、Java,成为未来十年最流行的语言。
      
      
      我曾在2007年第2届ECUG大会上提到了我对未来软件产业趋势的判断:存储与计算将向服务端转移;PC单机转换为强悍的服务器+多元化的终端。这个趋势判断对我的职业生涯其实影响非常重大。
      
      从业务角度讲,正因为这个判断,促使我选择成立金山实验室研究云存储技术;也促使我关注Erlang这门面向分布式编程的领域性语言;促使我举办了一届届的ECUG大会;促使我加入盛大创新院,发起祥云计划(盛大云前身),做盛大网盘;促使我们成立了七牛,有了七牛云存储。
      
      从技术角度来讲,它促使我放弃了近10年的桌面开发经验,转向服务端开发。正如我在《我为什么选择了Erlang》中建议的那样:
      
      要么不写程序,要么就写服务器端程序;
      当然,你也可以去撰写移动终端设备上的代码,在PC平台上做开发的空间很小。
      
      在金山实验室时,我选择了Java语言,并积极关注Erlang语言,对其进行小范围试用,以及大规模使用的可行性评估。我的结论是:
      
      Erlang风格的并行思想真的很棒;
      Erlang语言优势与劣势同样明显,这门语言不适合规模化推广使用。
      
      Erlang的困难之处在于它是FP语言。我们缺乏深入人心的FP编程理论。我们并不了解FP“数据结构”学。这是Erlang语言无法逾越的门槛,决定了它只能是小众化语言。
      
      进入盛大创新院后,我选择了C++,原因是我个人更喜欢C++,而对Java的设计哲学非常不感兴趣。出于对Erlang风格的并行思想的喜爱,我创建了一个名为CERL的项目,取义Erlang Model for C++,表明我希望能够把Erlang那一套并行编程模型搬到 C++中来,降低分布式编程的负担。
      
      接触Go语言后,我发现CERL 2.0的并发编程模型,其实就是一个雏形版的Go语言并发模型,两者从理念上来说完全一致。
      
      七牛公司成立于2011年5月底,我们选择了Go语言作为七牛云存储服务端的主体语言。当时Go语言甚至语法都还没完全稳定下来。为什么我可以如此坚定地相信,选择Go语言不会有错,并且相信Go语言会成为未来十年最流行的语言?除了Go语言的并发编程模型深得我心外,Go语言的各种语法特性显得那么深思熟虑、卓绝不凡,其对软件系统架构的领悟,处处带给我惊喜。
      
      Go语言给我的第一个意外惊喜,是接口。当然,我意外的不是Go的非侵入式接口。在接口(或契约)的表达上,我一直认为Java和C#这些主流的静态类型语言都走错了方向。C++的模板尽管机制复杂,但走在了正确的方向上。但Go语言的接口远不是非侵入式接口那么简单,它是Go语言类型系统的纲。除了支持反射等高级特性外,Go语言还支持接口查询。
      
      Go语言给我的第二个意外惊喜,是极度简化但完备的“面向对象编程”方法。Go语言废弃大量的OOP特性,如继承、构造/析构函数、虚函数、函数重载、默认参数等;简化的符号访问权限控制、将隐藏的this指针改为显式定义的receiver对象。让我看到了OOP编程核心价值原来如此简单—只是多数人都无法看透。
      
      Go语言带给我的第三个惊喜,是它的函数多反回值和错误处理规范。函数多返回值比较容易想到,只有这样函数的输入输出才能清晰呈现,语义表达上才会足够清晰。不过让我没想到的是,Go引入了内置的error类型以及defer关键字来编写异常安全代码,让人拍案叫绝。
      
      Go语言带给我的第四个惊喜,是它功能的内聚。一个最典型的案例是Go语言的组合功能。对于多数语言来说,组合只是形成复合类型的基本手段。但Go语言引入了匿名组合的概念,让其他语言原本需要引入继承甚至虚拟继承这样晦涩概念来完成的事情,统一到了组合这样的一个基础上。
      
      Go语言带给我的第五个惊喜,是消除了堆与栈的边界。在Go语言之前,程序员是清楚地知道哪些变量在栈上,哪些变量在堆上。堆与栈是基于现代计算机系统的基础工作模型上形成的概念,Go语言屏蔽了变量定义在堆还是栈上这样的物理结构,相当于封装了一个新的计算机工作模型。这一点看似与Go语言显式表达的设计哲学不太一致,但我认为这是一项了不起的工作,且与Go语言的显式表达并不矛盾。Go语言强调的是对开发者的程序逻辑(语义)的显式表达,而非对计算机硬件结构的显示表达。对计算机硬件结构的高度抽象,将更有助于Go语言适应计算机硬件发展的变化。
      
      Go语言带给我的第六个惊喜,是Go语言对C语言的支持。可以这么说,Go语言是除了Objective-C、C++这两门以兼容C为基础目标的语言外的所有语言中,对C语言支持最友善的一个。什么语言可以直接嵌入C代码?没有,除了Go。什么语言可以无缝调用C函数?没有,除了Go。对C语言的完美支持,是Go快速崛起的关键支撑。还有比C语言更让人觊觎的社区财富吗?那是一个取之不尽的金矿。
      
      在《Go语言编程》一书的前言中,我谈到Go语言的基础哲学来源于C语言,而不是像Java、C#那样,学的是C++。C语言的成功在于它足够简单,所以Go语言也要非常简单。Go语言的定位就是成为互联网时代的C语言。本质上来说,Go语言的特性都围绕着以下设计哲学:
      
      大道至简,显式表达。任何封装都是有漏洞的。最佳的表达方式就是最直白的表达方式,不试图去做任何包装。
      最少特性原则。如果一个功能不对解决任何问题有显著价值,那么就不提供。
      
      尽管是40年来出现的语言非常之多,但我认为,谈得上突破了C语言思想,将编程理念提高到一个新高度的,仅有Go语言而已。
      
      Go语言是一门变革性的语言,要革的是C的命(顺便革Java的命)。Go语言很简单,但具备极强的表现力。从目前的状态来说,Go语言主要关注服务器领域的开发,但这不是Go语言的完整使命。
      
      我们说Go语言适合服务端开发,仅是因为它的标准库支持方面,目前是向服务端开发倾斜:
      
      网络库(包括 Socket、HTTP、RPC 等);
      编码库(包括 JSON、XML、GOB等);
      加密库(各种加密算法、摘要算法);
      Web(包括 Template、HTML支持)。
      
      而作为桌面开发的常规组件GDI和UI系统与事件处理,基本没有涉及。
      
      总之,我认为,Go语言将引领未来10年IT产业的发展。在最初5年内,Go语言会在服务器端编程上大放异彩,而桌面端的开发则仍然处于探索和完善期,预计在后5年才趋于成熟,成为各种手持设备上的主流开发语言之一。
      
      作者许式伟,七牛云存储CEO,曾任盛大创新院资深研究员、金山软件技术总监、WPS Office 2005首席架构师。开源爱好者,发布过包括WINX、TPL等十余个C++开源项目,拥有超过15年的C/C++开发经验。在接触Go语言后即可被其大道至简、少即是多的设计哲学所倾倒。七牛云存储是国内第一个吃螃蟹的团队,核心服务完全采用Go语言实现。
      
      本文首发《程序员杂志》经其允许转载。 本文选自《程序员》杂志2012年10期
  •     没有C语言基础想读懂这本书基本不可能,里面的代码很乱并且没有详细的解说,连注释也舍不得多加几句。虽然里面不停的吹捧go如何如何的优秀,但除了晦涩畸形的语法外,我并没有发现它优越在哪里。也许协程算是一个比较有特点的地方吧,但书中随处可见的秀优越真是很让人倒胃口。
  •     书主要分三部分, 第一部分是Go语言基本的语法; 第二部分是Go语言的特点, 例如goroutine和interface; 第三部分是一些网络开发实例, 最后还有一些关于工程和闲聊的话题.    严格来说, 三个部分都不合格. 第一部分主要问题是比较杂乱, 属于罗列语言特性. 组织得并不好也没有能够深入讲解一下(例如make的原理). 但总的来说还算可以接受.    第二部分的问题比较大, 有个事实错误是在介绍Go关键字时, 作者说goroutine是基于轻量级线程(即线程coroutine, 原书90页). 在第九章进阶话题中, 作者又一次提到, "从根本上来说, goroutine就是一种go语言版本的协程(coroutine)" (原书204页). 可是作者都没有给出任何的理由, 仅仅提到他相信如此.  其实翻看一下Effective Go, 就可以看到书中说: "之所以这个机制被称为goroutine, 就是因为现存的进程, 线程和协程的概念, 都无法准确的表达它". 根据我目前看到的讨论, goroutine本质应该是一种优化过的, 由运行时库进行动态分配栈空间的线程.    第三部分根本毫无意义, 不但代码就是go语言参考里面的实例代码, 连文字描述页仅仅是翻译了手册而已.
  •     需要有点C的基础。文字挺简单,讲解不是特别详细,入门可以。
  •     Go语言入门书,较系统。
  •     刚申请退货了。就第一章就多次出现 “革命性”,不敢继续看了。
  •     也就是用来快速入门的
  •     只看了前5章,个人感觉点到即止,深度不够
  •     @liutos
    淡定啦淡定。。
    interface都能成为C++关键字嘛!
  •     手游开发必备。。
  •     年代久了,里边很多例子现在运行没法通过了
  •     入门级的GO语言书籍,很好.
  •     对熟悉c++、java之类的码农还不错,不用重复学习基础,但是有些地方省略太多了,直接就认为你懂,或者认为go最牛逼,容易被误导
  •     内容的排版顺序太糟糕.
  •     语法整个一 Lua + Python啊(其实我是来淆CSP的
  •     Go语言入门书,涨涨姿势,拓展下姿势
  •     作为一门新兴语言,它的潜力并没有被大多数人所发现,但它蕴含的很多思想,是前所未有的思维上的优化
  •     入门不错的书,good
  •     Go语言
  •     这本书难得的烂~
  •     烂。
  •     入门
  •     适合有编程基础的同学阅读。这本书还可以命名为《写给 java/ c++ 程序看的 go 语言编程》。不是那种按部就班的从零开始的教学类课本,不会和你说什么是变量,什么是控制语句,所以不适合用来科普编程基础,适合作为提高类读物。
  •     校友哇! 第九章非常不错,就喜欢这种介绍底层实现的文章。
  •     默认参数什么时候成了OOP特性了?
  •     这本书大致讲解了GO语言的特性,但本人觉得很多东西都是一笔带过了。
  •     一般般吧,国人写的书也就这样
  •     编程用的,有帮助吧
  •     内容简单易懂,结合实例讲解,适合入门学习
  •       书多数部分反复强调一句话go比XX好、优秀,实在的东西写得比较浅,章节跨度优秀大。goroutin select 介绍不足。总的来书,看过之后很失望,无处不在的吹捧模式,让人生厌。对go有很好的期待,就不要看这个书了,真的佷差。我比较喜欢go的oo方式,channel + go比erlang actor,还有一些不便之处,更像是lib,不像erlang的solution。
  •     
  •     不错的书,给老公买的,他喜欢看这类书!
  •     看了前8章
  •     这垃圾语言讲的啥??敢不敢严谨一点
  •     错误多,废话多
  •     没有关键字总结 例子少了点
  •     讲解了最基本的Go语言编程的相关知识,最后进阶部分也因为篇幅的原因,没办法展开更多
  •     适合GO入门者学习
  •     本书,不适合0基础的人读,最好有c语言基础的人看
  •     全书洋溢着作者对go语言的爱
  •     还可以 继续学习中
  •     篇幅很少但是该讲的似乎也都讲了。
  •     很适合Go语言初学者的一本书
  •     去深圳和回北京的飞机上打发时间看完的
  •     不深,不详细,很多内容一笔带过
  •     入门好书。
  •     书中代码有很多的错误……这一点让我非常失望。感觉写作很不严谨。而且语法的介绍也不系统不具体。例如讲到make的时候一笔带过,根本不清楚具体的用法。感觉这本书不是非常合适入门学习。
  •     书不错 就是有点皱,内容很好
  •     开了一个头
  •     看的第一本Go的书籍,书中吹捧之处的确不少,可能也因为Go在很多方面都较常规语言(C C++ C# Java)优秀(方便)而给了作者自信,也就给了读者“黑其它语言”的感觉(黑语言是不应该的)。介绍的不算细致,300页也只能到这个程度了,况且最后的进阶篇(80%开始)作者还抽出篇幅匆匆介绍一下Go的高级功能。不管怎样这本书对于一个初学者(比如我)来讲看完之后还是有不少的收获,照着书上的代码来一遍,基本的Go特性也就有个脸熟了。接下来就是看官方的doc了。 语言这块的书籍国内就很少有写的让人容易接受的(该书是翻译?本地化做的不错),不是么。
  •     本来想给一星的,但是考虑到go语言书很少就多给了一颗星。该书对于初步了解go语言是足够了,但本书没有清晰的,由浅入深的章节设计,而是多内容耦合到一起了,还爱和其他语言做类比,还好我有非常强的C语言基础,还有半吊子的java,python基础,否则该陷入泥潭了
  •     不错的入门书
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024