自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go語言大神親述:歷七劫方可成為程序員!

開發(fā) 后端
現(xiàn)在這個時代似乎吹牛都不用打草稿,畫餅已成為常態(tài),搬個磚都敢說自己是工程師,會敲個“Hello World!”的都說自己是程序員。程序員真的是那么好入行的嗎? Daisuke Maki認為成為一個真正的程序員并不是件易事,以Go語言為例,想成為一個Go程序員需經(jīng)歷七大“劫難”。

現(xiàn)在這個時代似乎吹牛都不用打草稿,畫餅已成為常態(tài),搬個磚都敢說自己是工程師,會敲個“Hello World!”的都說自己是程序員。程序員真的是那么好入行的嗎? Daisuke Maki認為成為一個真正的程序員并不是件易事,以Go語言為例,想成為一個Go程序員需經(jīng)歷七大“劫難”。

Go語言大神親述:歷七劫方可成為程序員!

“歷劫1”:你堅信你可以用Go來做面向?qū)ο缶幊?

在經(jīng)歷了一次Go應(yīng)用之旅之后,你可能就會開始思考:“怎么樣才能讓這種語言更像面向?qū)ο蟮木幊陶Z言?”因為你已經(jīng)習(xí)慣了這種編程,你想要制作健壯的代碼、想要多態(tài)。

然后,你說:“一定有辦法實現(xiàn)的!”再然后,你就發(fā)現(xiàn)了結(jié)構(gòu)嵌入,它可以將來自封閉對象的方法巧妙的委托給嵌入對象,而無需重復(fù)代碼。這簡直是太偉大了!

當(dāng)然,很快你就會發(fā)現(xiàn)這并不能真正解決問題。因為結(jié)構(gòu)嵌入只允許委派方法調(diào)用,所以看起來你是在做多態(tài)方法調(diào)度,但關(guān)系并不是IS-A,而是HAS-A,方法調(diào)用的接收方不是封閉對象,而始終是委托方法調(diào)用的嵌入對象。

所以,你明白了不要試圖在Go中進行面向?qū)ο蟮木幊?

“歷劫2”:你相信goroutines會解決所有的問題?

在使用之前,你曾被“通過goroutines可以輕松運行并發(fā)代碼”所蠱惑,你所要做的就是使用Go關(guān)鍵字,同時運行所有函數(shù)或者方法調(diào)用。這時你自然就會想到通過讓代碼并發(fā)運行來***限度地提高代碼的效率。通過函數(shù)調(diào)用自動創(chuàng)建goroutines,甚至調(diào)用者都沒有意識到。沒錯兒,它的確做到了所有代碼都在同時運行,但是它讓代碼變得更復(fù)雜了。

Go允許用戶創(chuàng)建數(shù)百萬的goroutine,而且不會犧牲太多的效率,那么你真的應(yīng)該使用goroutine嗎?你要知道并行代碼相比在單線程中流動的代碼而言,是更加難以維護和調(diào)試對的。一次從多個goroutine訪問時,你要考慮共享對象是否正確同步?執(zhí)行順序是否絕對正確? goroutine是否在不再需要時實際退出了?

所以,goroutine并不是***的,一定要在必要的時候使用,而且盡量不要在用戶的后面使用goroutine。

并且因為您通過使您的函數(shù)調(diào)用自動創(chuàng)建goroutines來隱藏此事實,因此調(diào)用者甚至不需要意識到這一點。

“歷劫3”:你認為接口將代替面向?qū)ο缶幊探鉀Q所有的問題?

在你終于意識到對象無法使用多態(tài)之后,突然想到了可以利用接口提供的功能,接口支持API,所以可以使用它來編寫更健壯的代碼。

所以現(xiàn)在當(dāng)你編寫庫時,定義了所有的接口,只導(dǎo)出接口并具有私有結(jié)構(gòu),以便封裝成perrrrfect。它還為你提供了更多的靈活性來切換底層實現(xiàn),因為現(xiàn)在你已成功地將API與其實現(xiàn)分離。

接口雖然給予了你很大的權(quán)力,但它不是一個***解決方案。在面向?qū)ο缶幊讨?,它仍然沒有提供真正的多態(tài)性,而且你也要受到接口只能定義API的限制,無法將所有數(shù)據(jù)與其相關(guān)聯(lián)。

當(dāng)然,在某種場景下只導(dǎo)出接口是有意義的,當(dāng)代碼量比較小的時候,接口是很好的方法。但是如果在代碼量大的時候,你不得不額外再多編寫大量的代碼。

如果想要***限度的利用接口,可以在某些類型互換時使用。

“歷劫4”:你相信channel可以解決所有問題?

在你歷經(jīng)曲折,嘗試了多種方法曲線救國無果之后,也許某一天靈光一閃,“等等,還有channel。”

Channel隱式處理并發(fā)訪問,你相信通過channel可以巧妙的來處理同步、返回值以及使用各種channel的select語句來進行流量控制。

沒錯,channel是很有用的,和你的初衷也是相符的,它提供了一個在goroutine之間傳遞值的原語。但是,慢慢你就會發(fā)現(xiàn)使用channel的Go語言會出現(xiàn)很多問題,例如超時、阻塞I / O,同步問題等。

所以,你要明白channel是很簡潔的結(jié)構(gòu),但是如果濫用它會導(dǎo)致更復(fù)雜、難以調(diào)試的代碼。

“歷劫5”:“哼哼,Go語言也一般般嘛,哪有大家說的那么強大”

 

[[205483]]

“為什么?到底是為什么?寫Go代碼實在是太痛苦了,它一直不允許我按照自己的方式來寫。”在嘗試了各種方法之后,你發(fā)現(xiàn)它們都不能解決多態(tài)性和并發(fā)性的問題,你甚至開始懷疑Go語言存在的合理性,你覺得你被剝奪了其它語言提供的所有好的結(jié)構(gòu)和工具。

你認為用更有力的工具來表達抽象思想是絕對有必要的,而Go只是沒有削減它。

但是,你忘記了,所有的語言都是有限制性的,你不能只是一味的想要語言按照你的想法來運行,而不考慮當(dāng)初作者設(shè)計這門語言的初衷。

“歷劫6”:你開始意識到前面5個階段其實都是你在想象

到了這個階段,你基本上就放棄了各種小聰明的做法,決定根據(jù)大多數(shù)標(biāo)準(zhǔn)庫的寫法來編寫Go代碼。

這時候你還是有這么一個想法:我不想接受Go語言的方法。但是這個時候,一切就開始變得有趣了。

在我不得不放棄面向?qū)ο缶幊?,從而擁抱Go語言的同時,也不得不接受一個事實,編寫并發(fā)代碼實在是太難了。我始終堅信語言的重點是讓程序員編寫更簡潔的代碼,所以,一門語言它要足夠編寫執(zhí)行復(fù)雜的代碼,但是通過刪除某些關(guān)鍵工具,讓最終編寫的代碼更簡單。

“歷劫7”:羽化成仙

到了這個階段,你已經(jīng)完全接受了Go,你可以用Go來編寫所有的內(nèi)容,包括Perl / Ruby / Python的內(nèi)容。你開始意識到再也沒有錯誤困擾著你;你必須使用goroutines和channel,

因為你是Gopher;你會感到榮幸,Go語言竟然允許你這樣來編寫代碼。

恭喜,現(xiàn)在你已經(jīng)是一名Go語言程序員了!

責(zé)任編輯:未麗燕 來源: 程序師
相關(guān)推薦

2019-07-18 14:09:02

程序員軟件代碼

2015-04-10 19:37:34

程序員

2012-05-10 13:31:48

程序員開發(fā)者

2015-04-08 15:38:17

程序員程序員差距

2021-07-05 07:28:14

程序員菜鳥技術(shù)

2015-11-03 11:01:26

編程Anders微軟

2019-01-07 09:31:37

程序員測試人員代碼

2012-08-20 09:16:15

Go語言

2009-01-08 21:25:51

程序員筆記

2011-04-21 16:15:06

PrologjavaPython

2023-11-06 07:19:11

程序員GitHub社交媒體

2015-07-13 11:32:09

PHP程序員正確姿勢

2015-06-10 10:43:07

2013-07-25 09:40:01

程序員

2015-10-30 09:49:30

2010-04-20 16:26:03

面試

2010-12-21 15:15:01

完美程序員

2013-07-25 11:28:30

程序員

2015-01-14 10:17:28

高級程序員

2013-04-28 11:03:41

編程語言程序員私有云
點贊
收藏

51CTO技術(shù)棧公眾號