采访:关于 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的项目,借鉴其他语言的一些特性。