golang初体验

这一周终于抽空读完了许式伟先生的《go语言编程》。由于对go并发的支持很感兴趣,很早之前就想学一学go语言,这次由于6.824的课程作业的需要,终于认真的学习了一下。


就这几天的学习而言,我觉得有c/c++和python基础的同学应该很容易就上手go。下面我就从几个方面对比一下这几门语言,看看go究竟有哪些优秀的特点。


####基本类型

c作为一门有着悠久历史的语言,缺乏语言层面上对一些现在常用的高级数据结构的支持,而go却拥有python中常用的列表和字典,不过在go中,他们分别叫做数组切片和字典类型,用法上有一些不同,却都提供了需要的功能,这一点上,go比起c要自己手写数据结构要方便很多。但是,相比于python这种纯面向对象的设计,go还是保留了c中最为强大的指针。但是考虑到下面要提到的GC的支持,go对指针的使用做了一定的限制,比如不能在go中进行指针的运算。


####GC

内存泄露和野指针的问题一直是c/c++程序员的头疼的地方,由于c/c++的使用场景和更加追求性能的目标,为它们加上GC是不太可能的。为了方便程序员的使用,c++11提供了智能指针,这多少可以缓和一下c++项目中内存泄露的问题。但是go作为一门新出的语言,在一开始就不想让程序员在手工管理内存的坑里挣扎,提供GC也基本上是现代语言的标配。go的GC在早期的版本中多少在速度上还为人所诟病,但是到了1.5之后,go终于有了低延时的GC,这让它又多了一把利器。


####错误处理

go提供了defer,panic和recover三个关键字来用作错误处理。其中defer是让人眼前一亮的,有了它就再也不用在函数的末尾考虑资源的回收。相比于复杂而且难用的c++的异常机制,真是好用的不要太多。


####interface

我一直在好奇,这个特性为什么其他语言一直没有提出,也许是面向对象的设计实在太过扎根在脑中。而go从一开始就不打算提供语言层面上的继承,用组合来代替继承,用interface来代替多态。对代码的侵入性小,学起来也几乎没有门槛。interface基本上是go给我们的最好的特性,甚至在某种层度上比goroutine还要重要。我怀疑这是不是受到了像python这样的动态语言影响,go的interface也是采用了duck type的思想,有什么样的方法就认为是什么样的类型。在使用上会让人很舒服,从找到的资料上来看,也能完全代替其他高级语言中的继承+多态的组合。


####goroutine

这个特性是go这门语言名字的由来,也是我最初接触到go的原因。协程并不是一个全新的概念,python也可以通过yield来模拟。但是在语言层面上的支持却成了go最大的卖点,通过goroutine,go又有了并发这个大利器。只是目前默认只使用了单核,但是可以预见在不久之后,对多核默认的支持也会到来


其实go还有很多其他的特性,比如工程管理,手写过Makefile的同学应该知道管理一个c工程的麻烦,这也是为什么会有automake,cmake这些工具出现的原因。但是, 使用go,你只用按照格式组织好你的工程目录,剩下的就交给go来考虑吧。


go的定位是21世纪的c语言,不过从现在来看,想要完全取代c语言还不太可能,可是在服务器端编程的领域,已经可以越来越多的看到go的身影,当然这也和它有一个好爹脱不了关系。无论如何,go语言都值得一学,毕竟也挺好上手的。

你可能感兴趣的:(golang初体验)