采访:关于 Go 语言和《Go Web编程》

astaxie
 astaxie
发布于 2013年02月17日
收藏 96

最近,在网上出现了一本名为《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语言吸引我的主要有如下几点:

  1. 它是系统级别的语言,静态编译,是C系列语言。
  2. 具有很多内置库,使用起来和Python很类似。
  3. 语法足够简单,入门学习成本很低,适合我这样从PHP和Python切换过来的人。
  4. 速度快,就拿简单的页面来说,我用PHP开发并发能够达到500很好了,但是用Go轻松就到上万,这是无法比拟的性能提升,而且用Go开发的效率和PHP差不多。
  5. 出自Google之手,而且有一帮牛人在维护,基于BSD开源,社区活跃。
  6. 开源项目给我很多自信,举几个开源系统:vitess(YouTube的数据库proxy系统)、nsq(bitly的一个实时信息处理系统)、skynet(轻量级的分布式服务框架)、七牛公司全部用Go开发、360开发的类iMessage应用,支持上千万用户,同时单台服务器长连80w,这些系统都是他们线上跑的,这给我更大的信心能够用Go来开发高性能,高稳定的应用。

主要的缺点:

  1. 有些库不成熟,例如图像处理。
  2. cgo在Window系统下面编译很麻烦,就拿SQLite的数据库驱动来说,在Window下面编译就会遇到很大的麻烦。
  3. runtime还不够成熟,GC还不是很好,不过听说Go 1.1版本会有比较大的性能提升。
  4. 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数据进行交互。采用这种模式开发主要有几点原因:

  1. 我认为JavaScript渲染页面方面比Go的模板做的好很多,而且JavaScript现有的库非常多,很容易做出很多效果,我的理念就是不管白猫黑猫,会抓老鼠就是好猫,合适的语言用在合适的地方。
  2. Go开发API相当地快速,而且性能很高,是PHP、Python之类的不能比拟的。
  3. 设计成RESTful API的话,系统就比较容易扩展,扩展性比较好。

目前内部的短域名服务采用了Go+redis开发,视频直播调度器全部采用了Go开发,内部的系统监控和自动化运维系统采用了JavaScript+RESTful API的形式开发,还有其他一些边缘项目都是采用Go开发。

同时我还开发了两个开源的项目:

  1. beego:一个模仿Python的tornado系统开发的Go开发框架,现在开发的几个系统都是基于该框架开发。
  2. 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的项目,借鉴其他语言的一些特性。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:采访:关于 Go 语言和《Go Web编程》
资讯来源:InfoQ
加载中

最新评论(31

SirKai
SirKai

引用来自“Movoin”的评论

@astaxie 哈喽, 文中提到的<PHP扩展开发及内核应用>连接怎么是挂羊头卖狗肉啊~~怎么成<PHP和MySQL Web应用开发核心技术>了? 应该是 http://www.walu.cc/phpbook/preface.md
果然啊,谢谢谢谢。
写这个文章的是想卖那个连接指向的书吧……
Movoin
Movoin
@astaxie 哈喽, 文中提到的<PHP扩展开发及内核应用>连接怎么是挂羊头卖狗肉啊~~怎么成<PHP和MySQL Web应用开发核心技术>了? 应该是 http://www.walu.cc/phpbook/preface.md
今天天气不错
今天天气不错
每一次看Go方面的东西都有很多的了解,已经决定要学了。钱途无可限量。
heiing
heiing
刚刚整理了一份PDF文档:
http://download.csdn.net/detail/heiing/5069970
狗头666
狗头666
出个纸质的书呗,但是感觉还是不完善,我到现在连个环境都配置不好,为什么GO要使用设置系统变量
nate_yhz
nate_yhz
学过一段时间。。。我恶心官方文档的过度简洁。。。
K6F
K6F

引用来自“喵了个咪”的评论

的确是作者一个人写的,只是大家看的时候帮忙纠错而已,我就提交过一个错误修改。

额,惭愧,我提交过错误的错误修改~
戴威
戴威
的确是作者一个人写的,只是大家看的时候帮忙纠错而已,我就提交过一个错误修改。
王阿觉
王阿觉
买书支持!
我土鳖

引用来自“我土鳖”的评论

引用来自“astaxie”的评论

引用来自“我土鳖”的评论

前一阵子看了这本书,内容很好,但是有许多细微的文字和标点符号上的错误需要纠正,另外用词遣句全文并不一致,似乎是由多人编写的,需要有人来统稿。

好像就我一个人写的,全文不一致吗?我的思路是断层的[13]

1 GO环境配置
一种并发的、带垃圾回收的、快速编译的语言。 -> 一种能够并发、带有垃圾回收特性、能够快速编译的语言。
编译一个大型的Go程序。 [[Go可以省略,“它”字已经指代了。]]
避免了大部分C风格include文件与库的开头 [[很别扭。不知道作者的原意是什么,不好妄加揣测。]]
它的类型系统没有层级。 -> 它的类型系统不分层。
因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。 [[感觉起来怎么讲?谁的感觉?读者刚看的话可能一头雾水。]]
Go完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持。 -> Go语言有着完备的垃圾回收功能,并发执行和[Goroutine之间的]通信也是构建语言的基础。
按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。 -> 根据其设计特点,Go语言希望给用户提供一种能够在多核计算机上构建[build/construct?]系统软件的方法。
它也打算成为现代的, -> 它也打算成为现代化的、[用顿号更好,语义不中断]
支持网络与多核计算的语言 -> 面向网络和多核计算的语言
需要解决一些语言上的问题: -> 需要在语言设计之初就加入相关的解决办法:
这些无法通过库或工具解决好, -> 仅仅依靠库或者外部工具几乎无法处理这类问题,

以上是我个人一点点修改方面的浅见,尚请斧正。

一种并发的、带垃圾回收的、快速编译的语言。 -> 一种具备并发能力、带有垃圾回收特性、能够快速编译的语言。

这样写似乎更好些,因为没法修改回复,所以就写在下面了。
返回顶部
顶部