go 語言學習曆程

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

go 語言學習曆程

2015-01-04 10:57 8160人閱讀 評論(4) 收藏 舉報 分類:go語言(34) 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

接觸go是2012年的時候,真正開始系統的學習和開發系統是2014年了,go語言的學習也算自己2014年的重要工作之一,對go語言學習的總結,也算是年底總結之一

1.學習go的原因和動機:
            1>先前做過2年Unix c開發經驗, 對於C系的語言有特殊的感情,go特別適合我胃口,用過後愛不釋手;
            2>go語言團隊太過耀眼和強大:Thompson 圖靈獎獲得者,unix 和C的共同發明人;Pike PLAN9作業系統的主要開發人員、UTF-8發明者;Robert Griesemer 參與java的HotSpot, js v8引擎開發人員;
          3>國內傳道者的極力推薦:許式偉兄,謝孟軍兄等強力推薦及相關書籍問世;

2.學習資料:
           書籍是:老許的《go語言編程》、 老謝的《go web編程》、 雨痕的《go 語言學習筆記》、 golang.org上面的《Effective Go》、《The Go Programming Language Specification》、go標準庫和github上眾多開源庫

            當然無聞的視頻教程也是非常適合初學者的,跟著他一起把代碼敲一遍事半功倍
           
3.go 學習體會:
go 語言基礎知識非常簡單,簡單到幾天就可以學完,並能夠上手開發;但是要做到精通,沒有一定的代碼量和幾年的經驗很難達到,這是學習任何一門程式設計語言都必須要經曆的,你唯一能做的是:不停的寫代碼,不停的思考,不停的總結,不停的讀別人代碼,向高手請教;


4.go 學習痛點,將我在學習中遇到的痛點,以及相關參考資料索引出來,這些知識點對新入門的學習者有點難,但是對於想全面掌握go技能的開發人員來說,我認為是非常有價值的,這些知識點都是個人一步步學習趟過坑之後去發掘的:

  • go map slice string array interface 底層資料模型,其中array 和slice是引起混亂的根源;參見:Russ Cox非常經典文章

Go Data Structures

Arrays, slices (and strings): The mechanics of 'append'

  • go defer panic recover 是go特有的,go的錯誤就是錯誤,異常就是異常,沒有混為一談,這個設計表面上看代碼煩亂了,實際上更清晰;try catch表面上是清晰,實際上隱藏著太多的問題。(兩種錯誤處理機制:異常拋出機制-錯誤碼處理機制)

使用Defer的幾個情境

  • go interface 介面的底層實現機制(能深入到源碼)(深入才能理解:介面賦值,介面轉換,介面斷言及go的動態性);go就是一門面向介面、面向組合編程的語言,對於go語言來說介面是靈魂一點都不為過;

參見:老許《Go語言編程》 第9章 9.5節 介面機理

參加:國外一位大佬寫的:How to use interfaces in Go

參見:interfaces_and_types

參見:Learning Go - Interfaces & Reflections

  • go 類型系統:這個對掌握一個語言非常重要:static type(語言層面就是靜態類型語言), dynamic type(動態類型針對介面而言) ,underly type(底層類型針對強制轉換和賦值);go的類型系統比較簡練,乾淨,都是實值型別,即使像slice,map,channel,func 等看起來是參考型別,其實也是實值型別,只是其內部資料結構封裝了指標罷了;不像JAVA有兩套類型:基本的是實值型別,對象是參考型別,中間又有裝箱,拆箱動作,更有奇葩的string;

參見:The Go Programming Language Specification-type

參見:Learning Go - Types

  • go function :多值返回;帶命名的返回參數用法;閉包;函數是一等公民;高階函數;函數也是一種基礎類型,可以type xxx func 為函數新定義一種類型;並發go以h函數為載體;對象是附有行為的資料,而閉包是附有資料的行為

參見國外大牛:Function Types in Go (golang)

go閉包:函數編程之閉包漫談(Closure) Go語言(Golang) - 閉包   

go函數式編程:go函數式編程實踐

  • go 參數傳遞:函數參數全部是傳值:即使傳遞的是指標,傳遞的也是指標的拷貝;閉包引用外部變數是引用
所謂引用是指使用的不是指標,但是卻有指標的效果,引用:a做為參數傳遞函數內部,函數內部修改a卻改變了外部a的值

指標:*a作為參數傳遞到函數內部,函數內部修改了*a的值,外部a指向的值也發生改變;

參見:Go語言的傳參和傳引用  這篇文章分析的非常到位時難得好文章

  • go error 處理機制,error 與nil 關係,參見

Go中error類型的nil值和nil

國外這兩篇文章寫得也比較好,教你如何自訂error以返回更具體的錯誤;

Error Handling In Go, Part I

Error Handling In Go, Part II


  • go nil  也一直是困擾go學習者的一個絆腳石

上面有篇 error nil 相關的文章

這裡有陳一回的 Interface nil 的文章 golang: 詳解interface和nil  陳兄關於go的幾篇文章都非常接地氣,建議都看了

  • go package、全域const(常量)、var(變數)載入順序,及package引用機制:
參見:老許翻譯的那本《Go語言程式設計》

  • go reflect :反射是一個強大的武器,是一個新手成為老手的必須涉獵的東西,也是元編程的一種方式,其效能相對來說不太高(靈活性也帶來效能問題)

參見:官方版 laws-of-reflection

翻譯版的:The-laws-of-reflection  我認為這是翻譯的最好的一篇文章,融入了作者的思考和感悟

還有我的簡寫版的,更多的是個API的指引:The laws of reflection

反射小試身手:參考這篇在 GOLANG 中用名字調用函數  Mikespook翻譯的其他文章也非常棒

martini 架構使用的經典DI庫:inject  教科書辦實現注入

inject庫代碼非常晦澀,可以參考陳兄的這邊經典文章golang: Martini之inject源碼分析 這篇文章深入淺出,寫的非常好

反射與介面、go類型系統關係非常密切,refelct.TypeOf 返回的是介面的dynamic type  , func (v Value) Type() Type返回value的type,   reflect.Type表述的是underlying type

  • go channel和gorutone使用方法;並發編程模式;實現原理. 如果形容go語言是一個皇冠,goroutine 和channel則是皇冠上的明珠,go是CSB並發編程理論的實踐者和改良派;go將並發編程的複雜性降低了一個數量級,從此並發編程不再是某些自稱“技術淫人”的專利;世界本應該如此簡單,語言和編譯器能做好的事情就不要讓程式員瞎忙活,這是go的哲學;

相關參考:

參見《go並發編程》(說實在的,這本書寫的沒有達到我期望的水準,寫的都是基礎,語言有點囉嗦,挖的夠深,但是拔的不高,所謂拔的不高就是沒有系統的介紹並發設計模式)

參見goroutine背後的系統知識

go 記憶體模型   英文版   中文版  英文需要翻牆,有點晦澀難懂,中文的這一篇寫的非常好,融入譯者自己的思考,推薦閱讀;

go語言並發之美 這篇文章寫得非常好,對常用的併發模式寫的深入淺出,這點《go並發編程》一本很厚的書居然沒有這些內容,實在讓人失望,有點徒有虛名

Google IO大會上大牛的幾篇文章(有牆)

Concurrency is not Parallelism   這裡有篇翻譯的並發不是並行

Go Concurrency Patterns

Advanced Go Concurrency Patterns

Go Concurrency Patterns: Pipelines and cancellation  這裡有篇翻譯:Go併發模式:管道和顯式取消


  • go 調度器模型,go記憶體管理,GC,go 調試與效能分析,跨平台;這些都是進階命題,當程式遇到效能問題時,你可能需要去瞭解go並發的實現機制,找到問題點,規避或者改進或者找到替代方案;除非你有強烈的好奇心,一般的程式員不會去讀整個運行時的實現。

參見雨痕學習筆記

The Go scheduler  這裡有篇翻譯go調度器

阿里skoo的幾篇文章  對調度器過程寫的非常生動

《go並發編程》對go調度也做了論述

國外的這篇PPT寫的也不錯 ,還有一篇

github上有本電子書 寫的非常深入,對go的幾個關鍵點實現進行深入剖析,非常好的文章


5.架構學習:

  學習了謝大的beego架構,beego非常容易入門,模組化設計,並且模組非常齊全;謝大人比較熱情,QQ群較活躍,,我的兩個小系統都是基於beego開發的;小黑的這篇導讀對於想看架構源碼的人來說是個福音;

Martini 只是看了inject那部分,2015年希望有時間細看一下 martini 和 revel。


6.期待

   期待有個牛人能出一本專門介紹 go 如何設計大系統的書,go語言設計模式和物件導向設計模式有很大差別;老許有一篇PPT裡面介紹go的連線導向和組合的語言,以七牛系統的規模,應該可以抽象出一套模式出來,有人做嗎?並發的相關設計模式,網上有多文章,但是還不是很系統;希望2015有人能站出來做這件事情,我們好站在巨人的肩膀上繼續前行。


其實不是為了學習而學習: 我很大一部分時間還是邊開發,邊瞭解標準庫,邊學習;遇到比較大的通用的模組到github上找有無已經實現的,如有借鑒過來吧,如果你認為自己改寫的比原作者好,可以pull request. 當然在開發中遇到自己知識的盲點,就需要有股專研的精神,把它搞明白,技術也就自然得到提高,個人薄見,謹慎參考。


http://www.laktek.com/2012/01/27/learning-go-types/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.