這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
接觸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 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特有的,比較新,需習慣使用;
使用Defer的幾個情境
- go interface 介面的底層實現機制(能深入到源碼)(深入才能理解:介面賦值,介面轉換,介面斷言及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(底層類型針對強制轉換和賦值);
參見:The Go Programming Language Specification-type
參見:Learning Go - Types
- go function :多值返回,帶命名的返回參數用法;閉包;函數是一等公民;函數也是一種基礎類型,可以type xxx func 為函數新定義一種類型;
參見國外大牛:Function Types in Go (golang)
- go 參數傳遞:函數參數全部是傳值:即使傳遞的是指標,傳遞的也是指標的拷貝;閉包引用變數是引用;
所謂引用是指使用的不是指標,但是卻有指標的作用,引用:a做為參數傳遞函數內部,函數內部修改a卻改變了外部a的值
指標:*a作為參數傳遞到函數內部,函數內部修改了*a的值被改變;
參見:Go語言的傳參和傳引用 這篇文章分析的非常到位時難得好文章
- go error 處理機制,error 與nil 關係,參見
Go中error類型的nil值和nil
- go package、全域const(常量)、var(變數)載入順序,及package引用機制:
參見:老許《Go語言編程》
- go reflect :反射是一個強大的武器,是一個新手成為老手的必須涉獵的東西
參見:官方版 laws-of-reflection
翻譯版的:The-laws-of-reflection 我認為這是翻譯的最好的一篇文章,融入了作者的思考和感悟
還有我的簡寫版的,更多的是個API的指引:The laws of reflection
martini 架構使用的經典DI庫:inject 教科書版的學習代碼
- go channel和gorutone實現原理;使用方法;並發編程模式;
參見《go並發編程》
參見goroutine背後的系統知識
- go gc:瞭解下go記憶體管理,GC實現原理go 調試與效能分析,GDB調試技術
參見雨痕學習筆記
5.架構學習:
學習了謝大的beego架構,beego非常容易入門,模組化設計,並且模組非常齊全;謝大人比較熱情,QQ群較活躍,,我的兩個小系統都是基於beego開發的;小黑的這篇導讀對於想看架構源碼的人來說是個福音;
Martini 只是看了inject那部分,2015年希望有時間細看一下 martini 和 revel。
6.期待
期待有個牛人能出一本專門介紹 go 如何設計大系統的書,go語言設計模式和物件導向設計模式有很大差別;老許有一篇PPT裡面介紹go的連線導向和組合的語言,以七牛系統的規模,應該可以抽象出一套模式出來,有人做嗎?並發的相關設計模式,網上有多文章,但是還不是很系統;希望2015有人能站出來做這件事情,我們好站在巨人的肩膀上繼續前行。
其實不是為了學習而學習: 我很大一部分時間還是邊開發,邊瞭解標準庫,邊學習;遇到比較大的通用的模組到github上找有無已經實現的,如有借鑒過來吧,如果你認為自己改寫的比原作者好,可以pull request. 當然在開發中遇到自己知識的盲點,就需要有股專研的精神,把它搞明白,技術也就自然得到提高,個人薄見,謹慎參考。