题图:
Tim Trad
from zoommy
早期经常有人问我学习编程语言应该从哪一门入手,我一般会推荐 Java 和 Python,这两门分属静态语言和动态语言,应用广泛,上手方便,上能九天揽月,下可五洋捉鳖,能写出小工具小网站,也构建出世界级的大型互联网帝国,比如淘宝,比如豆瓣。我一般很少推荐 C 或者 C++ 这种前进的路途上密布荆棘和陷阱的语言,人还没看到鲜花,可能已经从入门到放弃了。
现在会有人问我,投资自己的时间去学习最有价值和前景的编程语言,你会推荐哪些?以我个人拙见,我会推荐 Go、Python、Lua 和 JavaScript。
世间没有无缘无故的爱,推荐当然也有理由,比如 Go 在服务器端强大的并发处理能力,优雅的类型设计和简洁的语法。推荐 Python 是因为这门古老的语言在大数据和机器学习时代重新焕发了生机,几乎所有顶级的机器学习项目,比如 TensorFlow,都优先把 Python 作为第一支持的语言。推荐 Lua 是因为 OpenResty 的崛起,大部分互联网应用都会涉及到服务器端的负载和连接能力,这方面 Lua 有着得天独厚的能力,目前 OpenResty 创始人章亦春已经开始提供基于 OR 的商业化解决方案,未来,也许可以用 Lua 构建大部分业务系统呢。至于 JavaScript,据说前端开始统治世界了,他们手里的屠龙刀就是这门语言。
今天闲话一下 Go 吧,希望能写个小系列。
以前开玩笑总说 Go 站在编程语言鄙视链顶端,鄙视其他所有语言。关于这一点 Lisp 是不服气的,因为 Lisp 是编程鼻祖,PHP 也是不服气的,因为 PHP 是世界上最好的语言。但我这么说也不是没有道理,因为 Go 「世出名门,雍容华贵」,具备正宗的编程血统。使用 Go 语言编程的程序员们都像手拿 AK47 的企鹅,雄赳赳,气昂昂,杀进互联网。
什么名门呢?
2009年,世界上最大的互联网公司 Google 推出了一门新的编程语言 Go,也叫 Golang,这是一门静态类型、编译型、并发型并具备垃圾回收机制的编程语言。这门语言的三个设计者对于程序员来说如雷贯耳,他们分别是:
Robert Griesemer
:曾协助实现 Java 的 HotSpot 编译器和 JavaScript V8 引擎。
Rob Pike
:曾是贝尔实验室的 Unix 团队和 Plan9 操作系统成员,与 Thompson 一起创造了 UTF-8 字符编码。
Ken Thompson
,不用多说了,技术圣殿的人物,创造了 C 语言和 Unix,获得了 1983 年图灵奖和 1988 国家技术奖。
据说这些大神们创建 Go 语言的初衷是:近十年来开发程序之难让我们有点沮丧。于是 Go 诞生了。
Golang 是一门全新的、现代的、语法简洁并容易上手的编程语言,它不像 Scala 或 JRuby 这样的语言,要依附或脱胎于其他平台或语言,而是抛开历史包袱完全重新设计的、致力于充分发挥现代硬件性能的一门工程语言,具备独立的运行时库,就像 C 语言一样。
C 语言的强大勿用多言,但我们不得不承认,C 是一门既简单又极度复杂的语言,以至于你每写一行代码,都能想象出编译后指令的执行,堆栈的分配,C 充满了太多不着边际的规则,程序员如同行走在黑暗的森林里无所适从。Go 就好得多,语法关键字和控制语句都做到了最简模式,并且规则严谨,少有歧义,不像 Ruby 那样可以写出各种「奇技淫巧」的黑魔法代码。无论是高手还是初学者,大家写出来的代码都差不多,如同太祖长拳,在普通拳师和乔峰手里,威力大不相同,但招式都差不多。这是简单的本质。
Go 语言的 Hello World 是这样的:
package main
func main() {
println("Hello, World")
}
写一段异步执行的程序也非常简洁,比如在执行程序的时候你想异步记录一些日志:
func log(msg string){
...
}
go log("Bad things happened...")
Go 语言简化了自增和自减运算符,保留了指针,把切片(slice)和字典(map)作为内置类型,从运行时层面进行了优化,保证了语言的简洁和容易使用。
其并发模型是使用 Go 编码的程序员们最喜欢的特性之一。到了多核的时代,并发编程差不多成了程序员必备技能。哪一种并发模型更好?Java 的 ForkJoinPool,还是 Erlang 的 Actor + Message,还是 Objective C 的 Grand Central Dispatch:Block + Queue,亦或是 Hadoop 的 MapReduce……最终 Go 推出了自己的并发模型 goroutine 和 channel。
大部分异步模型都是显式的,一旦要开启异步模式都会大喊一声,闪开,我要创建线程了,并配以明显的出场标志(比如披风和外穿红色内裤)。Go 就低调的多,它通过类协程的方式处理并发单元,从语言层面对并发编程提供支持,比如 go log(…) ,这条简单到二爷都能看懂的代码已经默默的完成了所有异步功能,低调的就像日理万机而又默默无语的安姐(她帮别人解除焦虑的起始句是:我19岁大学毕业的时候……听完大家都焦虑了)。