Go 语言初体验

前几天看了云风关于 golang 的博客,勾起了我对 golang 的极大兴趣。
所以就趁这两天抽空,断断续续把七牛许式伟的 《Go语言编程》看完了,感觉特别过瘾。
golang 这门语言设计得非常简单,但是闪光点却很多,而且都很合我的胃口,我甚至觉得所有 C++ 程序员都没有理由去讨厌 golang(当然如果死活不肯接受 golang 代码风格的话,那确实没办法)。
所以在此零碎记录几个非常喜欢的特性吧。

【函数多返回值】

经常写代码的人都知道,对于函数多返回值的需求一直都有。
在 C++ 中,解决方法一般是传入多个引用作为函数参数,或者将这多个参数包装成 struct 类型,然后再传入,使用引用是为了减少拷贝开销。
当 struct 这个类型拷贝代价小的时候,可以不在参数里面传入引用,而是直接作为函数返回值返回。
在 STL 里面,对于 map 的 insert 函数,就可以注意到该函数的返回值其实就是两个,用 pair<Iterator, bool> 包装起来的。
而 golang 从语言层面上直接解决了这个痛点,舒服而简单。再也不用为了返回多个值而专门定义 struct 了。

【花括号等风格的统一】

记得两年前第一次了解 golang 的时候,会觉得 golang 太自大了,把花括号的风格都定死了。
但是经过工作中不断因为风格不统一而导致得种种不和谐的事情之后,开始明白规范统一是为了更高效的协作。
可能很多人会拿 google 编码规范来说事,当然,如果全世界都是遵守同一份规范的话,那确实没有问题。但是实际上很难让全世界都遵守。
从此我深刻理解到从语言层面定死这种写法,会带来无限的便利。再也不需要为一些风格引起不必要的沟通代价。

【包管理】

如果没有包管理,那 golang 不可能敢自称为现代化的语言,在我看来,对于新型语言,包管理几乎就是标配。
享受过包管理的便利的人,是不可能再想回到以前那个自己拷贝代码自己适配的古老方式。
至今用过最好的包管理是 nodejs 的 npm, 没有之一。还没仔细用 golang 的包管理发布过代码。但是相信golang 的包管理应该也不差。

【接口是非侵入性的】

对于滥用 OOP 的行为,我简直是再讨厌不过了。OOP 的思想我个人觉得只有接口和封装是精髓。
而继承就是花拳绣腿,每本介绍继承的书里面都要说什么鸟会飞,麻雀是鸟,所以会飞之类的看上去头头是道的学院派例子。
但是在实际应用中,滥用继承几乎就是整个项目的癌症。
而 golang 中对于接口的设计非常简洁,耳目一新,抛弃了乱七八糟的集成,只保留和 OOP 的接口和组合。
而且,对于接口也设计成非侵入性的,也就是使用接口不需要集成该接口,只需要实现了该接口定义的那些函数即可。
非常符合直觉,漂亮的避免项目因为滥用各种接口和继承导致可读性极差的问题。

【defer 关键字】

defer 这个语句我再喜欢不过了,在 C 语言中,资源销毁或者内存回收一直都是很蛋疼的问题。
经常有人在函数开头写了 new ,然后再末尾写了 delete,或者是 open 和 close 等 。
刚开始还好好的,但是在需求变了的时候,一着急,在函数的中间当发生某些异常时,写了 return 来终止函数。
此时就会发生内存泄露等事故。
对于此,C++ 的解决方案是用析构函数来解决。反正不管函数在哪里结束,对象的析构函数都会自动调用,也就防止此类低级错误的发生。
但是在 golang 里面,抛弃了构造函数和析构函数。其实很多喜欢 C语言的人,都会觉得 C++ 的构造函数和析构函数太臃肿。
但是C语言本身没有析构函数的支持,对于资源的回收又必须要小心翼翼,一不小心就会犯错。
所以在此 golang 的 defer 很明显解决的 C语言的痛点,也无愧为自称的“更好的C语言”,至于和 C++ 的解决方案(析构函数)孰优孰劣,就没有那么悬殊了。

【并发相关的 (go, chan, select) 关键字】

在多核时代,多线程等并发编程技术几乎成了每个后台服务工程师的标配技术。
golang 的作者明显深明此道,索性直接从语言层面上直接支持并发。
对于此我只想说:干得漂亮。
go 来操作协程,再也不需要为了简单的并发运行某函数需要各种库和继承的啰嗦代码了。 chan 可以类比为 C/C++ 里线程安全的 blockingqueue 。
select 就是 C/C++ 里面经常使用到的 (select/poll/epoll) 的同类产品。 这三个关键字大大简化了并发编程的心智劳损,实在是神来之笔。

【总结】

很明显的是, golang 的设计者对于软件开发经验实在丰富,而且属于实战派的软件工程师。
从 golang 中一些语言层面设计和其他主流语言不一样的地方就可以看出,作者是非常用心的讲究软件工程体系。
如果是从 python 等语言转过来学习 golang 的工程师,可能第一感觉会觉得 golang 语言奇怪得不可接受。
但是如果是从 C/C++ 出身的工程师来说,golang 无疑是一门非常让人愉悦的语言。
至少对于我来说,golang 一直在解决的就是在 C/C++ 软件开发工程中的各种痛点。
而且解决得非常漂亮。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。