如今這個時代彷佛吹牛都不用打草稿,畫餅已成爲常態,搬個磚都敢說本身是工程師,會敲個「Hello World!」的都說本身是程序員。程序員真的是那麼好入行的嗎? Daisuke Maki認爲成爲一個真正的程序員並非件易事,以Go語言爲例,想成爲一個Go程序員需經歷七大「劫難」。程序員
在經歷了一次Go應用之旅以後,你可能就會開始思考:「怎麼樣才能讓這種語言更像面向對象的編程語言?」由於你已經習慣了這種編程,你想要製做健壯的代碼、想要多態。編程
而後,你說:「必定有辦法實現的!」再而後,你就發現告終構嵌入,它能夠未來自封閉對象的方法巧妙的委託給嵌入對象,而無需重複代碼。這簡直是太偉大了!併發
固然,很快你就會發現這並不能真正解決問題。由於結構嵌入只容許委派方法調用,因此看起來你是在作多態方法調度,但關係並非IS-A,而是HAS-A,方法調用的接收方不是封閉對象,而始終是委託方法調用的嵌入對象。編程語言
因此,你明白了不要試圖在Go中進行面向對象的編程?函數
在使用以前,你曾被「經過goroutines能夠輕鬆運行併發代碼」所蠱惑,你所要作的就是使用Go關鍵字,同時運行全部函數或者方法調用。這時你天然就會想到經過讓代碼併發運行來最大限度地提升代碼的效率。經過函數調用自動建立goroutines,甚至調用者都沒有意識到。沒錯兒,它的確作到了全部代碼都在同時運行,可是它讓代碼變得更復雜了。工具
Go容許用戶建立數百萬的goroutine,並且不會犧牲太多的效率,那麼你真的應該使用goroutine嗎?你要知道並行代碼相比在單線程中流動的代碼而言,是更加難以維護和調試對的。一次從多個goroutine訪問時,你要考慮共享對象是否正確同步?執行順序是否絕對正確? goroutine是否在再也不須要時實際退出了?spa
因此,goroutine並非萬能的,必定要在必要的時候使用,並且儘可能不要在用戶的後面使用goroutine。線程
而且由於您經過使您的函數調用自動建立goroutines來隱藏此事實,所以調用者甚至不須要意識到這一點。設計
在你終於意識到對象沒法使用多態以後,忽然想到了能夠利用接口提供的功能,接口支持API,因此可使用它來編寫更健壯的代碼。調試
因此如今當你編寫庫時,定義了全部的接口,只導出接口並具備私有結構,以便封裝成perrrrfect。它還爲你提供了更多的靈活性來切換底層實現,由於如今你已成功地將API與其實現分離。
接口雖然給予了你很大的權力,但它不是一個終極解決方案。在面向對象編程中,它仍然沒有提供真正的多態性,並且你也要受到接口只能定義API的限制,沒法將全部數據與其相關聯。
固然,在某種場景下只導出接口是有意義的,當代碼量比較小的時候,接口是很好的方法。可是若是在代碼量大的時候,你不得不額外再多編寫大量的代碼。
若是想要最大限度的利用接口,能夠在某些類型互換時使用。
在你歷經曲折,嘗試了多種方法曲線救國無果以後,也許某一天靈光一閃,「等等,還有channel。」
Channel隱式處理併發訪問,你相信經過channel能夠巧妙的來處理同步、返回值以及使用各類channel的select語句來進行流量控制。
沒錯,channel是頗有用的,和你的初衷也是相符的,它提供了一個在goroutine之間傳遞值的原語。可是,慢慢你就會發現使用channel的Go語言會出現不少問題,例如超時、阻塞I / O,同步問題等。
因此,你要明白channel是很簡潔的結構,可是若是濫用它會致使更復雜、難以調試的代碼。
「爲何?究竟是爲何?寫Go代碼實在是太痛苦了,它一直不容許我按照本身的方式來寫。」在嘗試了各類方法以後,你發現它們都不能解決多態性和併發性的問題,你甚至開始懷疑Go語言存在的合理性,你以爲你被剝奪了其它語言提供的全部好的結構和工具。
你認爲用更有力的工具來表達抽象思想是絕對有必要的,而Go只是沒有削減它。
可是,你忘記了,全部的語言都是有限制性的,你不能只是一味的想要語言按照你的想法來運行,而不考慮當初做者設計這門語言的初衷。
到了這個階段,你基本上就放棄了各類小聰明的作法,決定根據大多數標準庫的寫法來編寫Go代碼。
這時候你仍是有這麼一個想法:我不想接受Go語言的方法。可是這個時候,一切就開始變得有趣了。
在我不得不放棄面向對象編程,從而擁抱Go語言的同時,也不得不接受一個事實,編寫併發代碼實在是太難了。我始終堅信語言的重點是讓程序員編寫更簡潔的代碼,因此,一門語言它要足夠編寫執行復雜的代碼,可是經過刪除某些關鍵工具,讓最終編寫的代碼更簡單。
到了這個階段,你已經徹底接受了Go,你能夠用Go來編寫全部的內容,包括Perl / Ruby / Python的內容。你開始意識到再也沒有錯誤困擾着你;你必須使用goroutines和channel,
由於你是Gopher;你會感到榮幸,Go語言居然容許你這樣來編寫代碼。