有一段时间没更新了。最近在忙一个Server+Client的项目,Client是Android手机,大概也就是几十的规模。 Server是纯Golang实现,没有apache或者ngix这种web server,也没有数据库,本身写了个文件管理module,handle这种小规模的服务没问题。算下来接触Golang也有四个多月了,断断续续写 了一些东西,这里纪录一下心得吧程序员
先大概说下为何用Golang。我是一个对语言有洁癖的人,曾经是一个c+Python的坚决呐喊者,最常说的一句话就是,只要熟练这两种,什么 状况都能应付,根本不用Java和C++(纯指我所在的领域)。核心代码用c,速度快,须要记的语言细节少;外围用Python glue,灵活,简洁,任何模块都容易上手,绝配。Java的繁琐,C++的无数无用的特性,都让我只在不得不用的时候才去用。Objective-C是 另外一个我欣赏的语言,问题是不跨平台,过于封闭。golang
惋惜的是,在这个节奏极快的时代,不是全部状况下都适合上c。以前有一个项目也是相似的架构和规模,为了节省时间,当初几乎没有服务器平台编程经验的我, 在服务器端选择用Django+Apache+MySQL作,成熟,社区活跃,又是python做为主要开发语言,这些都是这个选择的缘由。说实话,几个 月过去后,回首看,这不是一个愉快的经历。Django是一个好架构,大而全,而大而全有时也就意味着臃肿,五花八门的配置,过紧的模块耦合对引入第三方 工具限制颇多,自带的ORM又很差用。以前历来没有搞过服务器配置的我,对Apache的配置和效率所带来的琐碎的东西也头疼。总的来讲这个部分花了我很 多时间,有新手学习服务器编程的必通过程,也有折腾Django和Apache不必的时间浪费,很大部分上抵消了Python带来的快速开发的灵活性。 而一旦服务器上线,动态语言带来的一些bug又会让人头疼。对于普通高校实验室这种没有完善的服务器调试的条件,基本就是改了就上线用,有些隐蔽bug到 某些条件分支才会触发,一旦在运行中途出问题,改起来也麻烦。web
从那时起,我就特别想,要是有一种语言能把c和Python的优势结合起来,也就是说数据库
- 速度快,高性能
- 简洁明了,须要记的语言细节少,开发迅速(c)
- 灵活,开发快速,类Python的list,map等经常使用数据结构支持(Python)
- 完善的模块支持,模块也容易上手(Python)
- 对程序员友好的并行架构(Erlang)
- 安全,绝大部分问题能消灭在compile time中(C minus pointer)
那基本就是系统级和网络级编程最对我胃口的语言了。而后我就找到了Go。apache
Golang是一个新语言,截至目前为止,初版正式版尚未发布。Golang的设计者是Robert Griesemer, Rob Pike和Ken Thompson,当年设计C和Unix,后来的Plan9团队中的人 。Golang的设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来。若是你想更深刻了解Golang的发展历史以及完整 的目标,请参考Golang FAQ。编程
固然,Golang吸引个人地方,不是由于其是Google出品,也不是由于其设计者皆为大牛,而是由于,Golang真的作到了它所宣称的目标。 Golang就如同C和Python中间的完美结合,若是你是Python爱好者,又追求代码的速度和并行化,那么简单说,Golang就是为你设计的。 Golang有很浓厚的C的遗风,尽可能屏蔽C++和Java的影响,好比没有独立的OO体系(并非说不能OO),一切以struct为中心,没有 exceptions(Oh yes!),仍然有指针,等等。可是,Golang又吸收了不少新语言的精华,并带有本身独特的设计。好比后端
1. 保留但大幅度简化指针安全
Golang保留着C中值和指针的区别,可是对于指针繁琐用法进行了大量的简化,引入引用的概念。因此在Golang中,你几乎不用担忧会由于直接操做内寸而引发各式各样的错误。
2. 多参数返回
还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操做么?在Go里面这是彻底没必要要的。并且多参数的支持让Go无需使用繁琐的exceptions体系,一个函数能够返回期待的返回值加上error,调用函数后马上处理错误信息,清晰明了。
3. Array,slice,map等内置基本数据结构
若是你习惯了Python中简洁的list和dict操做,在Golang中,你不会感到孤单。一切都是那么熟悉,并且更加高效。若是你是C++程序员,你会发现你又找到了STL的vector 和 map这对朋友。
4. Interface
Golang最让人赞叹不易的特性,就是interface的设计。任何数据结构,只要实现了interface所定义的函数,自动就implement了这个interface,没有像Java那样冗长的class申明,提供了灵活太多的设计度和OO抽象度,让你的代码也很是干净。千万不要觉得你习惯了Java那种一条一条加implements的方式,感受还行,等接口的设计愈来愈复杂的时候,无数Bug正在后面等着你。
同时,正由于如此,Golang的interface能够用来表示任何generic的东西,好比一个空的interface,能够是string 能够是int,能够是任何数据类型,由于这些数据类型都不须要实现任何函数,天然就知足空interface的定义了。加上Golang的type assertion,能够提供通常动态语言才有的duck typing特性, 而仍然能在compile中捕捉明显的错误。
5. OO
Golang本质上不是面向对象语言,它仍是过程化的。可是,在Golang中, 你能够很轻易的作大部分你在别的OO语言中能作的事,用更简单清晰的逻辑。是的,在这里,不须要class,仍然能够继承,仍然能够多态,可是速度却快得 多。由于本质上,OO在Golang中,就是普通的struct操做。
6. Goroutine
这个几乎算是Golang的招牌特性之一了,我也不想多提。若是你彻底不了解Goroutine,那么你只须要知道,这玩意是超级轻量级的相似线程 的东西,但经过它,你不须要复杂的线程操做锁操做,不须要care调度,就能玩转基本的并行程序。在Golang里,触发一个routine和 erlang spawn同样简单。基本上要掌握Golang,以Goroutine和channel为核心的内存模型是必需要懂的。不过请放心,真的很是简单。
7. 更多现代的特性
和C比较,Golang彻底就是一门现代化语言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language相似), function是first class object,等等等等。
看到这里,你可能会发现,我用了不少轻易,简单,快速之类的形容词来形容Golang的特色。我想说的是,一点都不夸张,连Golang的入门学习 到提升,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Golang,从入门到可以上手作项目,最多不过半个月。Golang给人的感 觉就是太直接了,什么都直接,读源代码直接,写本身的代码也直接。
有朋友要抗议了,你把Golang吹的这么好,难道它就没有缺点?有,固然有,不过和它的优势比,我以为不少缺点都是由于整个语言太新,不成熟,随 着时间的推移都能获得解决,相比之下都能忍了。若是你但愿进一步了解Golang的优缺点,能够参考如下yufeng写的这篇文章,系统编程语言明日之星 —Go(http://blog.yufeng.info/Go.pdf。
还有朋友要说,Golang这么好,为何没人用?我想说,眼界放开点,这个世界精彩的东西比你想象的多。Golang被Google用于Youtube的数据库,被愈来愈多的国外公司(大部分创业公司)用于后端开发,甚至在天朝,也有彻底用Golang作服务开发的云应用公司了。能够说,随着Go 1即将到来的正式推出,Golang的使用范围,应该会愈来愈广。
好,总结时间
若是你是Python和动态语言狂热爱好者,Go不必定能给你带来很大的惊喜,这纯粹取决于你得项目性质,考虑到Python目前在不少地方都用C作核心运算,速度在大部分状况下都不是大问题。scalability是一个问题,但并非人人都会遇到的。
若是你是C爱好者,强烈建议你学习和使用Go。Go能够调用C/C++程序,又提供了太多的便利,速度上稍有牺牲,但并不大。在绝大部分场景下Go能给你带来媲美C的性能,而对于某些确实性能过于关键的场合,也能够经过cgo让Go和C搭配。
若是你是Java爱好者,除非你是作Android这种不得不用Java的平台,不然也建议你尝试学习Go,这个开发上感受的差别如同比较开载着1吨石头的拖拉机和开保时捷911那么明显,而Java能给你的,Go能给得更好。
若是你是C++爱好者,!@#$%^&*,恭喜你,至少你的智商应该是没问题的。人生苦短,赶忙脱离C++这个苦海吧。你用来学89个C++高级特性的时间,估计已经用Go写了64个开源项目了。
若是你是像我同样的C和Python的爱好者,对动态语言又没有特殊的热爱……我还须要说什么呢?
让咱们荡起双桨,去遨游Golang的海洋吧。