Go语言大神亲述:历七劫方可成为程序员!

如今这个时代彷佛吹牛都不用打草稿,画饼已成为常态,搬个砖都敢说本身是工程师,会敲个“Hello World!”的都说本身是程序员。程序员真的是那么好入行的吗? Daisuke Maki认为成为一个真正的程序员并非件易事,以Go语言为例,想成为一个Go程序员需经历七大“劫难”。程序员

“历劫1”:你坚信你能够用Go来作面向对象编程?

在经历了一次Go应用之旅以后,你可能就会开始思考:“怎么样才能让这种语言更像面向对象的编程语言?”由于你已经习惯了这种编程,你想要制做健壮的代码、想要多态。编程

而后,你说:“必定有办法实现的!”再而后,你就发现告终构嵌入,它能够未来自封闭对象的方法巧妙的委托给嵌入对象,而无需重复代码。这简直是太伟大了!并发

固然,很快你就会发现这并不能真正解决问题。由于结构嵌入只容许委派方法调用,因此看起来你是在作多态方法调度,但关系并非IS-A,而是HAS-A,方法调用的接收方不是封闭对象,而始终是委托方法调用的嵌入对象。编程语言

因此,你明白了不要试图在Go中进行面向对象的编程?函数

“历劫2”:你相信goroutines会解决全部的问题?

在使用以前,你曾被“经过goroutines能够轻松运行并发代码”所蛊惑,你所要作的就是使用Go关键字,同时运行全部函数或者方法调用。这时你天然就会想到经过让代码并发运行来最大限度地提升代码的效率。经过函数调用自动建立goroutines,甚至调用者都没有意识到。没错儿,它的确作到了全部代码都在同时运行,可是它让代码变得更复杂了。工具

Go容许用户建立数百万的goroutine,并且不会牺牲太多的效率,那么你真的应该使用goroutine吗?你要知道并行代码相比在单线程中流动的代码而言,是更加难以维护和调试对的。一次从多个goroutine访问时,你要考虑共享对象是否正确同步?执行顺序是否绝对正确? goroutine是否在再也不须要时实际退出了?spa

因此,goroutine并非万能的,必定要在必要的时候使用,并且尽可能不要在用户的后面使用goroutine。线程

而且由于您经过使您的函数调用自动建立goroutines来隐藏此事实,所以调用者甚至不须要意识到这一点。设计

“历劫3”:你认为接口将代替面向对象编程解决全部的问题?

在你终于意识到对象没法使用多态以后,忽然想到了能够利用接口提供的功能,接口支持API,因此可使用它来编写更健壮的代码。调试

因此如今当你编写库时,定义了全部的接口,只导出接口并具备私有结构,以便封装成perrrrfect。它还为你提供了更多的灵活性来切换底层实现,由于如今你已成功地将API与其实现分离。

接口虽然给予了你很大的权力,但它不是一个终极解决方案。在面向对象编程中,它仍然没有提供真正的多态性,并且你也要受到接口只能定义API的限制,没法将全部数据与其相关联。

固然,在某种场景下只导出接口是有意义的,当代码量比较小的时候,接口是很好的方法。可是若是在代码量大的时候,你不得不额外再多编写大量的代码。

若是想要最大限度的利用接口,能够在某些类型互换时使用。

“历劫4”:你相信channel能够解决全部问题?

在你历经曲折,尝试了多种方法曲线救国无果以后,也许某一天灵光一闪,“等等,还有channel。”

Channel隐式处理并发访问,你相信经过channel能够巧妙的来处理同步、返回值以及使用各类channel的select语句来进行流量控制。

没错,channel是颇有用的,和你的初衷也是相符的,它提供了一个在goroutine之间传递值的原语。可是,慢慢你就会发现使用channel的Go语言会出现不少问题,例如超时、阻塞I / O,同步问题等。

因此,你要明白channel是很简洁的结构,可是若是滥用它会致使更复杂、难以调试的代码。

“历劫5”:“哼哼,Go语言也通常般嘛,哪有你们说的那么强大”

 “为何?究竟是为何?写Go代码实在是太痛苦了,它一直不容许我按照本身的方式来写。”在尝试了各类方法以后,你发现它们都不能解决多态性和并发性的问题,你甚至开始怀疑Go语言存在的合理性,你以为你被剥夺了其它语言提供的全部好的结构和工具。

你认为用更有力的工具来表达抽象思想是绝对有必要的,而Go只是没有削减它。

可是,你忘记了,全部的语言都是有限制性的,你不能只是一味的想要语言按照你的想法来运行,而不考虑当初做者设计这门语言的初衷。

“历劫6”:你开始意识到前面5个阶段其实都是你在想象

到了这个阶段,你基本上就放弃了各类小聪明的作法,决定根据大多数标准库的写法来编写Go代码。

这时候你仍是有这么一个想法:我不想接受Go语言的方法。可是这个时候,一切就开始变得有趣了。

在我不得不放弃面向对象编程,从而拥抱Go语言的同时,也不得不接受一个事实,编写并发代码实在是太难了。我始终坚信语言的重点是让程序员编写更简洁的代码,因此,一门语言它要足够编写执行复杂的代码,可是经过删除某些关键工具,让最终编写的代码更简单。

“历劫7”:羽化成仙

到了这个阶段,你已经彻底接受了Go,你能够用Go来编写全部的内容,包括Perl / Ruby / Python的内容。你开始意识到再也没有错误困扰着你;你必须使用goroutines和channel,

由于你是Gopher;你会感到荣幸,Go语言居然容许你这样来编写代码。

恭喜,如今你已是一名Go语言程序员了!

相关文章
相关标签/搜索