采访:关于 Go 语言和《Go Web 编程》
最近,在网上出现了一本名为《Go Web 编程》的书籍,里面详细地讲述了使用 Go 语言进行 Web 编程的各个方面。很特别的是,这本书是在 GitHub 上以开源的方式撰写的。日前,InfoQ 采访了这本书的作者谢孟军先生,请他来和大家谈谈 Go 语言以及他撰写的开源书籍。
InfoQ:请您先简单和大家介绍一下自己。
谢孟军:大家好,我叫谢孟军,可以叫我 Asta,目前就职于盛大云,负责盛大云分发产品的研发。云分发就是我们平常所谓的 CDN 系统。
InfoQ:是什么原因促使您撰写《Go Web 编程》这本书呢?
谢孟军:我以前主要从事 PHP、Python 等 Web 方面的开发,后来到了盛大云之后接触比较多 C++ 等底层的东西,就想学习一下这些底层的技术。再后来看到许式伟的博客,了解到 Go 语言。Go 出自 B 语言的作者和 Unix 创始人 Ken Thomson 之手,而且还有多位牛人在后面支撑,该语言设计的初衷就是系统级别的语言。这正好符合我学习的目标,所以我就开始了自学之路。自学过程中发现 Go 在网络编程这一块为开发者提供了很多便利,既有 C 等语言的性能和排错能力,又具备 Python 等语言的动态特性,还内置了对多核并发的支持。
在学习的过程中,我发现 Go 在网络编程方面的表现非常好,而我以前主要从事 Web 开发,所以就想写《Go Web 编程》这样一本书,主要还是把以前在 Web 开发中的一些经验和 Go 语言结合起来,做一些总结,给后来者一些启示,希望对想学习 Go 语言的同学们一些帮助。
InfoQ:您撰写的这本书在 GitHub 上开源,为什么会采取这样的一种方式呢?
谢孟军:采用 GitHub 主要是我之前看到过一本书叫做《 PHP 扩展开发及内核应用》,这本书就是在 GitHub 上面写的,我看到之后很震惊,居然还可以这样来写书,而 markdown 又是如此的简洁,GitHub 对于 markdown 的支持也非常好,所以当初就决定在 GitHub 上面来写这本书。
InfoQ:Go 语言的哪些特点最吸引您?哪些特点让您觉得需要进一步改进?
谢孟军:Go 语言吸引我的主要有如下几点:
- 它是系统级别的语言,静态编译,是 C 系列语言。
- 具有很多内置库,使用起来和 Python 很类似。
- 语法足够简单,入门学习成本很低,适合我这样从 PHP 和 Python 切换过来的人。
- 速度快,就拿简单的页面来说,我用 PHP 开发并发能够达到 500 很好了,但是用 Go 轻松就到上万,这是无法比拟的性能提升,而且用 Go 开发的效率和 PHP 差不多。
- 出自 Google 之手,而且有一帮牛人在维护,基于 BSD 开源,社区活跃。
- 开源项目给我很多自信,举几个开源系统: vitess (YouTube 的数据库 proxy 系统)、 nsq (bitly 的一个实时信息处理系统)、 skynet (轻量级的分布式服务框架)、七牛公司全部用 Go 开发、360 开发的类 iMessage 应用,支持上千万用户,同时单台服务器长连 80w,这些系统都是他们线上跑的,这给我更大的信心能够用 Go 来开发高性能,高稳定的应用。
主要的缺点:
- 有些库不成熟,例如图像处理。
- cgo 在 Window 系统下面编译很麻烦,就拿 SQLite 的数据库驱动来说,在 Window 下面编译就会遇到很大的麻烦。
- runtime 还不够成熟,GC 还不是很好,不过听说 Go 1.1 版本会有比较大的性能提升。
- Go 的开源项目还不够多。我觉得一个语言的发展不仅仅是语言本身出色,还要有大公司推动或者好的项目推动。
InfoQ:有人说 Go 是互联网时代的 C 语言。与之相比,Go 语言有哪些优势,又有哪些需要改进的地方呢?
谢孟军:Go 语言确实吸收了很多 C 语言的特性,Ken 大叔毕竟是 Unix 的创始人,很多以前看 C 不习惯的地方,这一次 Go 里面都改进了,例如{}的换行,() 的去掉,强制格式化、去掉结尾分号等。而为什么 Go 被称为互联网时代的 C 呢?我认为是 Go 在语言级别上支持了并发,通过简单的关键字 go 就可以充分利用多核,这对于硬件不断发展的时代,这么简单就可以充分利用硬件的多核,这是多么重要的一个特性啊!但是相比 C 而言,Go 还缺少一些高质量的第三方包,例如 OpenGL 等,所以 Go 内部也支持用 cgo 直接调用 C 语言编写的代码。
InfoQ:有人认为 Go 语言会在以后追赶上 Java。与之相比,Go 语言有哪些优势,又有哪些需要改进的地方呢?
谢孟军:我的感觉,Go 要赶超 Java 还不知道要等到什么年代。 首先,Java 目前在企业应用中非常稳定,而且基于 Java 的应用很多,库也多,我想 Java 也会有很多基于 JVM 的类似语言出现,例如 Scala,我想 Go 要超越 Java 可能性不大。但是 Go 相比 Java 来说优点也是很明显的:简单,足够简单。记得以前有一篇 Go 创作者 Rob 写过一篇文章《大道至简》,就是讲为什么创建 Go 语言的过程。我想这一批老程序员的经验是值得我们学习的,就让我们用 Go 语言把复杂的事情简单化,简单的事情简单做,Go 也许就是这样一种语言。
InfoQ:您现在是否已经在项目中大量应用 Go 语言,主要在哪些方面呢?
谢孟军:我现在开发的项目基本都是用 Go 开发的,但是页面上我还是用 JavaScript 来渲染,我现在的开发模式是 JavaScript 渲染前端 +RESTful API,中间用 JSON 数据进行交互。采用这种模式开发主要有几点原因:
- 我认为 JavaScript 渲染页面方面比 Go 的模板做的好很多,而且 JavaScript 现有的库非常多,很容易做出很多效果,我的理念就是不管白猫黑猫,会抓老鼠就是好猫,合适的语言用在合适的地方。
- Go 开发 API 相当地快速,而且性能很高,是 PHP、Python 之类的不能比拟的。
- 设计成 RESTful API 的话,系统就比较容易扩展,扩展性比较好。
目前内部的短域名服务采用了 Go+redis 开发,视频直播调度器全部采用了 Go 开发,内部的系统监控和自动化运维系统采用了 JavaScript+RESTful API 的形式开发,还有其他一些边缘项目都是采用 Go 开发。
同时我还开发了两个开源的项目:
- beego :一个模仿 Python 的 tornado 系统开发的 Go 开发框架,现在开发的几个系统都是基于该框架开发。
- beedb: 一个 Go 语言的 ORM 库,可以像操作 struct 一样操作数据库数据。目前我们内部的 API 接口我就是采用了这个 ORM 开发的。
InfoQ:您认为 Go 语言在 Web 编程方面,哪些特点会让它更有优势?
谢孟军:前面也说了 Go 语言设计的时候是系统级别的语言,所以他本身就有性能上面的优势。其次 Go 在 Web 开发中内置的 net/http 包对于开发 Web 非常方便,用户可以很方便的就搭建一个 Web 应用。熟悉 PHP 的同学可能对于 nginx+fastcgi 配置都很熟悉,但是 Go 开发的应用就不需要 nginx,因为它自己就可以监控网络,解析数据包,而不依赖任何东西,你编译完之后扔到服务器起来就好了,这省去了一些部署的部分。最后就是 Go 的并发支持,大家都听说过摩尔定律,硬件只会越来越快,CPU 的核数也会越来越多,那么 Go 的这个特性就让我们这些程序员从以前的多线程处理中解放出来,让 Go 语言的 runtime 来帮我们做这个事情,那用使用 Go 来编写 Web 何乐而不为呢?
InfoQ:对于开始学习 Go 语言,并期待将其应用在项目中的读者们,您有哪些建议呢?
谢孟军:刚开始学习 Go 语言的朋友,我建议读一下官方的一些文章,都非常有帮助,如果你对英文敏感的话,那么就看看我写的那本书《Go Web 编程》。
在你应用 Go 到你的项目之前,希望你能够对于 Go 的特性有一定了解。目前 Go 语言的特性基本已经确定,接下来的版本都是基于性能的提升,新特性估计不大会有。然后,建议大家多读读 Go 内置的包源代码,因为这些包都是 Go 语言开发的,对于我们编写 Go 代码又很大的帮助,看看这些牛人们是怎么编写代码的。有句话说得好:学习牛人,复制牛人,超越牛人,最后我们自己成为牛人。
最后还是希望国内的技术人都学习一下 Go 语言,不管它现在对你有没有用,但是我可以肯定的说将来肯定有用,对于你开发项目时有扩展思路的作用,我现在也在学习 Node.js、Erlang,我学习他们是为了更好的开发 Go 的项目,借鉴其他语言的一些特性。
评论