要想快速高效率地掌握Go語言,關鍵是要經過不斷寫代碼去訓練,熟能生巧。方法是沒問題的,但具體的路徑呢?就像開車,能不能給個導航?我但願這篇文章能起到一個導航的做用,這裏提供的路徑,應該對不少人都適合。固然每一個人的具體狀況不一樣,所以路徑會有差別。你能夠對這個路徑進行剪裁,獲得最適合本身的。golang
短期和高效率是這裏的關鍵詞。其實只要你天天用Go來編寫程序,時間一長,也就掌握了,它不須要任何技巧,大智若愚,其實是一個不錯的辦法。但若是你想最快地掌握Go語言,仍是須要一些技巧的。sql
我之前也曾經學過一段Go,大概花了2周,基本的會了,但遠遠沒有達到掌握的程度。後來由於有其餘事情就放下了。如今回想起來,當時方法不對,效果也很差。後來用我如今要講的方法,在不到2個月的時間徹底掌握了Go語言。這也得益於我之前對Java比較熟。數據庫
什麼叫徹底掌握Go語言?下面是個人標準:編程
其中#2又包括兩點:架構
2.1. 熟悉經常使用的架構
2.2. 知道如何用Go語言來實現經常使用架構中的各個環節app
其中#2.1是跟語言無關的,須要長時間的編程積累,不是短期能完成的。#2.2是跟Go語言直接相關的,在瞭解語言的標準庫的基礎上還要熟悉經常使用的框架和第三方庫。好消息是Go的標準庫很是強大,你的主要精力要放在標準庫,除此以外你只須要兩三個外來庫就好了。框架
這個方法只適用於已有其餘語言編程經驗的人,這樣能夠藉助已有的其餘語言經驗,達到快速掌握Go的目的。其中2.1跟Go語言無關,主要是你之前的編程積累。你要作的是完成#1和#2.2。函數
高效率學習的關鍵是要進入一種正向反饋的自循環系統。在你掌握了基本Go語法以後,經過不斷用Go寫代碼來加深對語言的瞭解和熟悉程度,以後就能夠寫更多、更深、更好的代碼,這樣就造成了正向反饋的自循環系統。像滾雪球同樣,愈來愈大。微服務
快速的關鍵是用最短的時間進入這種自循環,也就是儘快瞭解Go基本語法。學習
學習分四個階段。 完成以後,你應該已徹底掌握Go語言。
當你完成1-3以後,你已基本掌握Go語言。#4幫你完成對整個語言的完整掌握。
以上4條給你提供了一個大體的導航,這樣你就知道了要去哪,中間路徑怎麼走,如今到哪了,還須要多長時間才能到達。
上面的時間只是個略估,每一個人的編程背景不一樣,天天所花的學習時間不一樣,最終完成時間和效果也會有很多差別。
這一階段的目的是快速瞭解Go語言的基本語法(沒必要深刻領悟細節),能本身編寫簡單程序(它包括安裝Go),找到一個合用的IDE。最好的的教材是「Go by Example 中文」。你沒必要完成全部的項目,只完成前面20個就好了。不少人推薦「Go 語言之旅」 這不是個好主意。 它對一些知識點摳的太細,不利於快速進入正向自循環。「Go by Example」講得很淺,即便你學會了實際上也並無深刻掌握知識點( 那是第二階段的任務),但第一階段只要知道大概就好了。正由於這樣「Go by Example」纔是最好的選擇。
第二階段的任務是掌握Go的主要知識點,大概有二三十個。 例如arrays和slices的區別,函數調用時傳參仍是傳值(若是傳值怎樣改變參數的值?),指針的用法,Go中哪些類型是指針類型(Interface是指針類型嗎?),Errors,Methods,package,go-sql,date 和time等等。這些看着簡單,但實際上要真正掌握仍是要費一些時間的。
在這一階段,你能夠經過寫一些小的程序來掌握知識點。好比寫一個訪問數據庫的程序,有增刪改查功能,數據庫字段包括各類類型(時間類型會複雜一點)。而後在這個基礎上增長域模型,把程序分層。
關鍵的一點是不要拷貝別人的程序,必定要本身用鍵盤把程序敲出來(能敲出一個字算一個,只有實在想不出來了再去看「Go by Example」)。只有這樣才能真正學到。剛開始可能會比較痛苦,但只有痛苦了,你才能學到東西,並且這是最快的方法。(固然,當你掌握了Go語言以後再拷貝別人的程序就沒有問題)
比較好的狀態是你天天都有問題,不斷地向本身提問(而後去解決問題),問題解決了,知識點就掌握了。提不出問題怎麼辦?不拷貝別人的程序是一個好辦法,我發現當本身用手一個字一個字地敲程序時(而不是拷貝別人的程序時)會不自覺地思考不少問題並注意到了不少之前忽略了的地方。好比說,像上面「函數調用時傳參仍是傳值?」,你能不能本身寫個程序測試一下,這樣本身就能把問題回答了,而沒必要到網上查資料去找現成的答案。測試時,若是類型是「string」或「int「很容易,若是是map, struct呢?測試以後可能還有問題,這樣再去看文章就有針對性,效果會更好。這種狀況下,學習過程是徹底有你來主導,是效率最高的。但須要你有比較好的編程基礎。
若是你天天提的問題很少,還不足以主導整個學習過程,那你須要看書或看網上的文章來輔助。但須要注意,它只是起輔助做用,重點仍是要經過寫代碼來領悟。每次看書的時間不要太長,太長了容易被它的思路帶着走,限制了本身思惟的活躍性。每次看文章只針對一個問題,充分聚焦。若是不是帶着問題而只是泛泛地看書極可能當時看明白了,但次日就又糊塗了或忘了。只有本身想明白的道理纔是你本身的,書上的都是別人的知識。這樣天天大概掌握1-3個知識點,每天都能感受本身在進步,這就是最好的一種學習狀態。
這時你已掌握了Go語言的基本知識點,是時侯寫一個真正的能夠在生產環境運行的程序了。
我建議你選一個熟悉的領域,好比一個簡單的電商或學生註冊課程的程序。大概有兩三個域模型類(struct)和數據庫表。程序能夠分紅三層,域模型層,業務邏輯層和持久層。先不須要有用戶界面。各層之間要經過接口調用, 這樣你可能還要經過容器(Application Container) 產生具體類型(Concrete Type)並用依賴注入(Dependency Injection)注入到函數中。這樣就有必定的複雜度了。固然這裏面牽扯到很多的設計問題。 若是你暫時不想考慮太多設計問題,那你只要把程序作出來就好了,也能達到掌握Go語言的目的,不過掌握的級別不同。 你也能寫出熟練的Go程序,只是不知道如何設計而已。
若是你想把設計也包括進去, 那你要思考不少問題,例如程序的目錄和包結構,設計架構和分層,編碼規範,日誌和錯誤處理,是否要支持事務。我在GitHub上完成了一個完整的程序,而且寫了一些列的文章「清晰架構(Clean Architecture)的Go微服務」講述上面的每一方面。 不過我不建議你一開始就看它。你須要本身先反覆考慮這些問題,仔細設計。不須要一步到位,能夠不斷地對設計和程序進行重構。這中間你可能會碰到各類各樣的問題,你須要在不斷解決問題中成長。當你寫到必定程度時,你能夠去看上面提到的文章,跟你的設計和想法進行對比,印證。 若是有興趣咱們還能夠討論,共同提升。
這時你已經基本掌握了Go, 再學習其餘的庫就會很容易,例如「Goroutines」,context」,「net/http」。我之因此把這些放在第四階段是由於它們不影響核心功能又有必定難度,放在最後,學習坡度會比較平緩。
若是你只想掌握Go語言,對時間沒有要求,那麼內容的選擇並不重要,任何學習內容和學習順序都是有幫助的。若是你但願在最短的時間內學會,那麼內容的選擇和學習的前後次序就比較重要了。下面是個人一些建議,固然你能夠根據自身狀況量體裁衣。
主要針對學習的第二階段。不建議上來就直接使用第三方庫。Go語言自己標準庫很是強大,能作不少事情。使用第三方庫反而會妨礙你對Go語言自己的理解。開始的時候仍是聚焦於語言自己。下面是部分可選知識點:
Module
strconv
string
time
go-sql
logging
。。。
主要針對學習的第三階段。我不主張一開始就選擇一個gRPC或Web的項目,由於它須要你額外瞭解gRPC或Web,這樣會分散你的注意力,你須要同時學習Go和gRPC或Web, 會加大難度。固然若是你已經對他們很熟悉就另當別論。原則是你必定要選擇一個阻力最小的方向,也就是你最熟悉的項目。對多數人來說,一個簡單的訪問數據庫的程序應該是阻力最小的。完成這個以後,若是你願意,能夠在它的基礎上加上gRPC或Web功能,若是你的架構合理,加上gRPC或Web會是一件很容易的事。
主要針對學習的第四階段。有些人對Go「Goroutines」有誤解,以爲它很容易。若是隻是簡單地寫一個「Goroutines」確實容易,但實用的「Goroutines」都須要「Goroutines」之間通訊和進行協調控制,要寫出能在生產環境中可靠運行的「Goroutines」並不容易。有人專門作過調查,Go的「Goroutines」雖然比Java的「thread」要容易得多,但在程序中產生問題的機率一點也不比Java低。若是是團隊項目的話,最好是在設計時就把「Goroutines」代碼和其餘代碼分開,並由專人負責。下面是一些能夠在第四階段學習的庫:
Goroutines (Channel)
net/http,
net/url
O/R mapping
reflect
決定那些文章要讀,那些能夠不讀,這裏主要針對Go官網上推薦的文章,在下載Go時就自帶的。
須要讀:
How to write Go code:
effective go:仍是有幫助的,但文章太長又枯燥,建議天天只讀一段,花兩週時間讀完,這樣不會太累。
不須要讀:
go faq:
關於Go語言歷史和特色:能夠掌握Go以後再讀
學習的過程同時也是遺忘的過程,只有成長的速度遠遠快於遺忘的速度才能一直進步。最好的方法是集中一段時間主要用來學習Go,假設每週花20小時,一個月基本小成,兩個月就徹底掌握了。若是天天花2個小時(一週14個小時),我估計因爲遺忘的做用,可能要兩個月小成,四個月才能徹底掌握了。若是天天一個小時,我估計一年也學不會。寫到這忽然有點泄氣,發現這纔是問題的關鍵,感受前面都有點白寫了。結論是若是是業餘想掌握Go確實須要比較大的毅力。
你可能要問,徹底掌握了以後若是一段時間不用,難道不會忘記嗎?也會忘,但那時你對Go語言自己有了深入的理解,很短的時間就能撿起來。若是隻是半生不熟的掌握,過了一段時間不用以後,就所剩很少了。