写点什么

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

2013 年 2 月 17 日

采访:关于 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 语言吸引我的主要有如下几点:

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

2013 年 2 月 17 日 02:0020821
用户头像

发布了 340 篇内容, 共 111.4 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

我的理财小心得

史前靓仔

PyTorch 1.5 发布,与 AWS 合作 TorchServe

神经星星

人工智能 facebook 微软 亚马逊云 AWS Lightsail 工具

Linux-常用命令

Flychen

Linux

2020版Kubernetes快速上手指南,让你所见即所得

ABC实验室

Kubernetes 容器 云原生 群集安装 新手指南

告别手写,一键生成 Helm Chart README

郭旭东

Kubernetes Helm

我是如何读完技术书,然后忘得一干二净的

ayesd

读书 读书方式

python 文章中图片下载

Flychen

为什么公众号订阅没有「分组」的功能?

Fenng

微信公众平台 产品设计

5G来临,我们该如何打造自己的家庭数据中心基础篇

ABC实验室

5G 数字资产 家庭数据中心

freecplus框架,Linux平台下C/C++程序员提高开发效率的利器

C语言技术网-码农有道

docker安装mysql5.7并挂载目录到本地

桥哥技术之路

Docker

扎心!天天写代码,方向真的对吗?

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

2020年程序猿必读10本好书推荐

ABC实验室

学习 2020 程序员 好书推荐

我的工作原则与思考

梁帅

互联网 工作效率 原则

从全国首起暗网案件告破说起——暗网,超乎你想象

石君

网络安全 暗网 洋葱网络

听保洁老大爷讲Java的垃圾回收

侯树成

JVM

给程序员的错误找个台阶

曲水流觞TechRill

NumPy 运算规则总结

张利东

Python

职场寒冬,给你讲四个小故事

池建强

人生 职场

Oracle 将为职场歧视买单,4100 位女员工集体诉讼

神经星星

oracle 互联网巨头 互联网 职场

使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (二)为什么要写单元测试

编程道与术

编程 编程语言 TDD 代码审查 单元测试

最新Idea 2020.1 二种方法激活教程

公众号:V5codings

intellij-idea

人是一切

Neco.W

个人感想 感悟

理解 Java 序列化

RookieMZL

自动化测试框架知识,读这一篇就够了!

陈琦

程序员 DevOps 自动化 测试

聊聊“坚持”这件事

小天同学

个人成长 写作 坚持 自控力

Flutter Andorid真机或打包APK杂症记录

北风烈

flutter 打包APK

常用电脑软件清单

彭宏豪95

软件 工具 windows 生产力

游戏夜读 | 游戏数据分析师

game1night

tcp_tw_recycle 【坑】

孤星可

TCP 服务端

自助设备系列——上下游

孙苏勇

产品 行业资讯 智能设备

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

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