Go,随风而起

Go

最近琢磨着把我们的平台产品扔到 Docker 上试试,Docker 是运行在 Linux 上的一个轻量级的虚拟容器,简单来说就是 Docker 利用Linux 的 LXC(Linux Containers)和 CGroup 技术为你的应用构建了一个独立的、资源隔离的、轻量级的沙箱,你可以在里面自己动手,丰衣足食,无论怎么玩都不会对整个物理服务器产生影响。虽然 Docker 的政策是闭关锁国,但是你在开发环境和生产环境之间进行应用系统迁移和部署又十分方便。

和传统虚拟机不同的是,Docker 容器并不会包含一个完整的操作系统,而是通过服务器现有的基础设施对资源进行管控的。基本原则就是,你以为自己是自由的,民主的,按需分配的,但其实你的配额是定量的,不作死就不会死的,当然也不排除你表现好的话,系统会再分一些资源给你。

关于 Docker,如果大家有兴趣,我以后可以写个系列。今天主要想说说 Docker 的实现语言:Go。

深入学习一门技术或框架的原则就是去读源代码,Docker 是 PaaS 提供商 DotCloud 开源的容器引擎,任何人都可以到 Github 上下载它的源代码。我拿到 Docker 的源代码后发现,好吧,人家大部分功能都是 Go 语言实现的。Go 语言威名远播,我虽早有耳闻,但却从未真正用过,正好借这个机会好好学习一下。

顺便说一句,技术人员最苦逼的地方就是,当你想学 A 的时候,你发现的不得不先把 B 搞清楚,当你去搞 B 的时候,会牵扯出 C、D、E、F、G,七大姨八大姑和小舅子什么的都出来了,技术之间的依赖关系往往搞得你心烦意乱、心猿意马,最后你会忘记自己的初心是 A。

所以,对于我这种高龄程序员,学完 Go 之后去搞别的并忘掉 Docker 的情况,也是完全可能出现的。

目前编程语言排行榜前三位分别是 C、Java 和 Objective-C,这三门编程语言的 Ratings 都超过了10%,风头正劲。C 不用说了,Unix 和 Linux 都是这货写的,系统级编程语言,无可替代。OC 虽老,却属新贵,随着 iOS 大红大紫。唯有 Java,当年如日中天,如今却显老态,常常为人诟病。其实从语言的发展潜力来看,Java 还远远没有进入老年时代,最多是个中年大叔,语法糖虽弱,但整个 Java 平台博大精深,衍生语言 Scala 和 Groovy 生命力正盛。不过,由于 Java 平易近人的工业语言特点,常常遭到很多半瓶子醋的嘲笑,其实大部分是自嘲,能骂到点子上的少之又少。为什么骂 C 和Objective-C的少呢?因为能把 C 整明白的人大都知道深浅,至于 OC,大伙正忙着学呢,哪有空骂?

与其他语言不同,Go 生于名门望族 Google,一出生就是富二代。2009年11月 Google 正式对外发布 Go 1.0版本,从此宣告了一门新语言的诞生。Google 首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去10多年间软件开发的难度令人沮丧。听了老罗这句话,台下很多程序员眼眶都湿润了。

Go 被誉为互联网时代的 C 语言,虽然目前声望还没法和那三位老大哥相比,但是程序员和极客们都对其寄予厚望。当然 Go 也没让大家失望,这几年发展迅猛,国内外很多厂家已经开始把 Go 语言用于生产环境,很多开源项目也开始用 Go 实现(比如 Docker)。最重要的一点是,据说 Go 的最佳开发平台是 OS X,其次是 Linux,最后是 Windows。这一点没什么可说的,因为我很早就说过,Mac 才是程序员的开发利器,Go 只是又一次印证了这一点而已。

经过几个晚上的学习和实践,我觉得我会喜欢上这门语言,令人印象深刻的语言特性有这么几个:

  1. Go 是一门系统级的编程语言,理论上 C 和 C++能干的事,Go 也干得出来,而且实现起来更加简单,如果 Go 愿意,也可以写个操作系统出来。
  2. 支持 GC(垃圾收集),无论是 GC 还是引用计数,这部分的功能应该是现代编程语言必备的,我们最好相信编译器,而不是人。
  3. 全新的静态类型语言,犯错的几率大大减少,同时具备动态语言的特性,无论是从 C、Java 或 Python 转过来都会感觉很舒服。
  4. 针对并发、多核和大规模集群的语言,goroutine的设计相当有趣,这部分需要好好理解一下。
  5. 更为丰富的内置数据类型,相对其他语言,增加了 map(字典)和 slice(数组切片),同时从语法层面进行了支持。
  6. 函数的多重返回值,这一点是程序员们千呼万唤的功能,这次 Go 有了。
  7. 基于关键字 defer、panic 和 recover 的异常处理机制,处理过程中使用了多重返回值的语法糖,defer 实现了类似 Java 里的 finally 功能,这部分的设计非常新颖。
  8. 闭包,现代语言必备
  9. 无继承的接口方式,方法的定义和类型的定义可以在完全不同的地方进行,还可以为现有类型动态添加新的方法,这一点有点像 Objective-C 中的 Category ……

一般来说,一种语言从诞生到广泛关注和应用,至少需要十年光景,而 Go 只用了几年时间就走到了这一步,着实令人惊叹。Go 诞生于网络、多核、高并发和大集群的时代,这是 Go 的机会,也可能是你我的机会。

Go,可以说是一门随风而起的语言,了解了 Go 之后,我们就知道,很多风口的东西,不一定是猪!

如果你也想试试这门语言,那么可以点击原文访问【Go 指南】,在线学习。

http://go-tour-zh.appspot.com