怎麼學習golang?

我是畢業以後才學的php,不是計算機專業。因此,我想學門靜態語言。目前,自己學習golang也有一段時間了。但是感覺golang總是入不了門!

和php比。感覺go較靈活。它的標準庫的很多函數、參數、返回值什麼的 不再像php一樣單純的就是那幾個基本數據類型,而是介面,甚至結構什麼的,而我總是被這些東西整得暈頭轉向!

看文檔不知道怎麼下手!求知乎的大神指點迷津!怎麼學習golang,或靜態語言?

----------------------一年以後--------------------

ps:感謝各位大大熱心的回答!


說了那麼多你其實就缺個教程,什麼長篇大論的我相信你激動萬分的看完還是不知道發生了什麼,在你會 go 之前也一定不明白那些牛逼的應用為啥牛逼,所以,廣告開始:

- 《Go編程基礎》 Unknwon/go-fundamental-programming · GitHub

- 《Go Web基礎》 Unknwon/go-web-foundation · GitHub

- 《Go名庫講解》 Unknwon/go-rock-libraries-showcases · GitHub


入門看官網的tutorial不錯,整整74頁 http://tour.golang.org/#1

然後看這頁里的各個鏈接,推薦順序:

http://golang.org/doc/code.html

http://golang.org/doc/effective_go.html

http://golang.org/doc/faq

http://golang.org/doc/cmd

http://blog.golang.org/gos-declaration-syntax

http://blog.golang.org/go-concurrency-patterns-timing-out-and

http://talks.golang.org/2012/concurrency.slide#1

http://talks.golang.org/2013/advconc.slide#1

http://blog.golang.org/error-handling-and-go

http://blog.golang.org/gobs-of-data

http://blog.golang.org/laws-of-reflection

http://blog.golang.org/profiling-go-programs

http://blog.golang.org/c-go-cgo

包文檔也要過一遍 http://golang.org/pkg/ ,這樣可以知道標準庫能做什麼,裡面的example也不少。


我是從python轉向go的. 起始版本是Go 1.1.

1 http://golang.org/doc/

主要看A Tour of Go, How to write Go code, Effective Go

2 熟悉package, GoDoc

package : strconv, net/http, net/url, string, math, time

3 練習, project eular. 每學一門新語言的時候, 可以來做一遍.

About - Project Euler

4 語言特點:

select, channel, defer, goroutine, 靜態類型(int, int64, 類型轉換), 閉包, package的組織形式

5 reflect

http://blog.golang.org/laws-of-reflection

6 閱讀開源軟體的源代碼, nsq, martini等.

7 使用go去做一個項目.


我是從Python轉到Go的,學了大概2個月, 期間寫了大概2500行遊戲伺服器框架(Skycrab/cham · GitHub),不包含測試代碼,不包含業務邏輯代碼。主要是學習https://github.com/cloudwu/skynet

寫的,主要就是實現golang的actor模型,服務之間的消息發送,消息處理,定時器實現,廣播實現,log模塊,websocket實現,gate模塊,debug service實現,還有一些基礎庫,如lru演算法,300行簡單的orm(curd),敏感詞過濾,還有一個從 @xjdrew的https://github.com/xjdrew/lua-zset移植的go版本sorted set實現。所以我覺得你缺的是一個開始,開始寫代碼,研究代碼,閱讀代碼,重構,反覆。

首先我想先回答一下你心裡的疑惑,因為你沒有C的基礎,又手php影響很深,所以剛開始接觸golang時有點不習慣。你可能會經常想做類比,在php中尋找golang的影子,但畢竟面向領域不一樣,差別還是有點大,所以遇到新的概念要快速接受,而不是一直懷疑這玩意怎麼用,然後做對比。golang中結構體不就類似php中的類嘛,php的成員變數不就是結構體成員嘛,只不過php把成員變數和方法用大括弧括起來了嘛;golang中的介面不就類似php的介面嘛,只不過php要顯示implemtns,golang是隱式實現而已。。。所以剛開始不要被糾結概念,快速接受,然後寫demo。

一開始閱讀golang標準庫對你不太適合,看過基礎教程之後開始寫代碼,從自己最擅長的開始,你是搞php的,建議從web開始,從 @asta謝的astaxie/beego · GitHub開始搞起,用beego做個小應用,先不要想如何牛逼,如何優美,先以功能實現為主。從操就業,這時一股熟悉的感覺瀰漫心頭,自信悄然而來,嘎嘎golang小kiss而已。注意,自信很重要,自信很重要,真的很重要,重要的話要說3遍。

自信來了,代碼也寫了,期間欠的債也該還了。啥,欠誰債了,你別嚇我,我沒錢。哈哈,當然是欠golang的債了,前期你玩了人家,很爽自信也來了,人家當然要賴著你了,yes,就是到了深入交流的時候了。這個時候你需要認真看項目中用到的標準庫實現原理,框架實現原理,學習代碼方式,golang的原理,可以讀讀Skycrab/go-internals · GitHub。這和談戀愛一樣,深入交流你才知道,她還會這個,還能這樣,哈哈,get新技能。當然這個階段是痛苦的,切記不要一股腦一直研究,不然會把你帶入深淵拔不出來。這和談戀愛一樣,你天天糾結人家七大姑八大姨的,前男友,前女友的,人家能給你好臉色才怪。要慢慢來,遇到糾結的地方先放一放,過段時間回頭再來。

參與牛逼項目,寫牛逼代碼,重構,重構再重構,這個階段會與上面階段交錯,此起彼伏。

學東西就和談戀愛一樣,追到手之前艱辛,追到手開始一段時間很幸福,中間會有一段糾結與美好並存的旅途,能否走到最後,看你能否堅持,是否常思考。。。


http://www.cs.cmu.edu/~dga/15-440/S14/index.html

這是CMU分散式系統課程,對應有四個課程項目,全部要求用go實現.項目都有完整的說明和單元測試程序.題主可以做一做


我覺得學習一門語言最重要的就是做到三點,第一看基礎知識,第二學習抄代碼,第三學習寫代碼

第一點,很多人都覺得上來就動手寫,但是你基礎的東西都沒掌握,怎麼寫呢?欲速則不達,所以基礎的東西還是必須要先掌握好.這裡推薦你幾個基礎的入門材料:

  • http://tour.golang.org/#1

  • 邢星翻譯的mikespook/Learning-Go-zh-cn · GitHub
  • Go by Example

我覺得你把這幾個基礎掌握之後就可以開始抄襲代碼了,如果你之前有PHP的開發經驗,那麼也許我寫的這本書對你了解golang有幫助, https://github.com/astaxie/build-web-application-with-golang

第二點,我們很多時候開始寫代碼都是沒什麼思路,也無從下手,但是我們可以模仿別人寫代碼,上海俗話裡面常說"吃大戶,用大戶,消滅大戶",我們就是"看代碼,抄代碼,最後自己寫代碼".這裡給你幾個入門級別的代碼看看學習一下:

  • Web.go - Quickstart 很簡單,就是學習他的路由怎麼實現的,如何編寫自己的路由

  • icub3d/home 路 GitHub 這是一個Go+ AngularJS的實現,看看如何做API應用

最後我列一下你可以自己參考去實現的一些功能,我當初培訓我們戰虎班的同學就是用這些來一起學習的.

  • 日誌分析
  • IP庫分析
  • 管理後台查看分析日誌

第三點,自己寫代碼,這個時候就是已經對golang有了一定的了解了,那麼我們就可以開始做自己的項目了,做項目最想就是快速開發,那麼我就推薦你

  • https://github.com/astaxie/beego 使用beego框架可以很快速的開發你的Web或者API應用

  • Homepage - Docker: the Linux container engine 使用docker來做虛擬化

  • skynetservices/skynet · GitHub 學習分散式

  • coreos/etcd · GitHub 分散式應用

這個階段就是找各種東西用golang來寫,多寫就會理解越來越深入.

交流群:148647580

Go技術社區:Go 技術社區


這個問題挺早的,那個時候還沒有又全面又透徹的 Go 入門書。

現在的話書最推薦The Go Programming Language,就是The C Programming Language的那個作者柯寧漢寫的,中文版地址在https://www.gitbook.com/book/wizardforcel/gopl-zh/details

看完這本書之後 Go 的各式語法就了解得差不多了,關於最佳實踐請看 Effective Go 和 Go in practice, 前者是 Go 官方提供的語言注意事項,後者的涉獵面更廣泛,作者似乎也是一個知名庫的作者。

再然後就是深入 Go 的內部實現,由於 Go 迭代很快,很多資料都過時了,目前值得一看的就是雨痕的 Go 學習筆記。但是這本書是針對 Go 1.5 和 1.6 的,1.7 和 1.8 又有很大的變動,所以最好的了解辦法是去看 Go 的 proposal, 設計文檔和 issue。


我最近也在學習go 不過是學著玩的。

除了上面asta謝的回答 我給你的建議是:先看 [無聞的go基礎視頻](Unknwon/go-fundamental-programming · GitHub) 另外他還有web系列的視頻自己找

除了看視頻 還要看看書啊 :)

基礎學差不多了 就要動手寫寫東西

比如命令行程序 web程序(做網站)

看你的個人愛好了 我當年學c時就是只知道在一個黑乎乎的window下弄命令行程序而放棄了繼續學習--太枯燥了 由於當時還不知道有GUI圖形界面編程這回事(呵呵 勿笑 如果沒記錯大家大學都學的是譚浩強的那本c語言吧 )之後的vc++(borland c++) 課程直接就暈菜

學某個語言要知道某個語言擅長那個領域 不能拿雞蛋當石頭用 要會揚長避短

最後找個目標項目(你所在領域的某些演算法或者業務 可以用程序實現 ) 一點點積累 只有做項目才能串聯所學的知識點

程序類型?命令行或者web程序 (api , 服務, job類的程序估計你暫時碰不到)

如果你對做網站感興趣 可以做個個人blog 。

先從 func mian(){} 開始吧 不要試圖一口吃個胖子

一生二 二生三 三生萬物 細胞是從一分化的 最後成為一個人體系統


關於學習Go,我在 系統學習GO,推薦幾本靠譜的書? 回答了,這裡再回答一下。

學習任何一門語言,都要學習好基礎,把基礎打牢,那些框架對你來說都是工具,你自己的基礎好,懂得了他們的原理,自己就可以創造更優秀的框架。

基礎推薦官方文檔,沒有什麼比這個更清晰了。官方文檔可以看這個中文的,比較快一些 https://go-zh.org/doc/

其次參考這個Go指南,練習一遍 https://tour.go-zh.org/welcome/1

現在對Go語言應該有了一個全面的認識,然後你再結合Go語言聖經這本書,深入理解Go的基礎。

Go語言聖經中文版 https://www.gitbook.com/book/yar999/gopl-zh/details

然後通過《Go語言實戰》這本書,In Action系列都是比較經典的,看這本書的實習可以參考我《Go語言實戰》這本書的讀書筆記,一共近30篇文章,15萬字,非常全面,書里沒有的我這裡也講到了很多。這裡列其中幾篇:

  1. Go語言開發環境搭建詳解
  2. Go語言實戰筆記(一)| Go包管理
  3. Go語言實戰筆記(五)| Go 切片
  4. Go語言實戰筆記(九)| Go 介面
  5. Go語言實戰筆記(十三)| Go 並發資源競爭
  6. Go語言實戰筆記(二十)| Go Context
  7. Go語言實戰筆記(二十四)| Go 反射
  8. Go語言實戰筆記(二十六)| Go unsafe 包之內存布局

最終再通過一些別的第三方庫源代碼和實踐,就可以完全掌握了。我最近也在分析一些經典庫,可以保持關註:

  1. Go語言經典庫使用分析(一)| 開篇
  2. Go語言經典庫使用分析(二)| Gorilla Context
  3. Go語言經典庫使用分析(三)| Gorilla Handlers 詳細介紹

更多更詳細更新的可以關注我上面的【公】【眾】【號】【flysnow_org】。

最後,希望這個可以幫助你。。


書籍、社區之類的上面的都答差不多了,初學者可以看看這個,新手遇到的了50個go語言的坑:50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs ,裡面很多的坑,我也在學的過程中遇到過,避免這50個坑,可以節省編譯期間的大部分時間,不說了,填坑去了


Go Programming Blueprints - 如果你不知道拿Go來做什麼

The Go Programming Language - 語言基礎


靜下心來,不要急躁,欲速則不達。

建議你先看:http://go-tour-zh.appspot.com/#1

逐個例子的看,慢慢的改例子,然後運行;確保自己理解教程中給出的每一行代碼,以及說明文字。

然後再去看:Unknwon/the-way-to-go_ZH_CN · GitHub

然後,你就可以用go做實際項目咯~


少廢話,多動手。

我從去年11月接觸到golang,已經上線三個實際項目了,第四個正在開發中。

先買了許世偉的書,啃了一周左右,就開始動手干,邊干邊學效率是最高的。


http://www.yinwang.org/blog-cn/2014/04/18/golang/

你需要看這個《對 Go 語言的綜合評價》——王垠


我同意以上答主觀點,看教程肯定是不能省略的,你不想連語法功能都不知道就開搞吧?但是除了看書以外,強烈推薦寫工程,這可不是腳本語言寫幾個文件練練手就行了

去年就接觸過golang,但只是翻了翻書,唯一的印象就是這個語言語法反人類:幹嘛類型都放後面?連繼承都沒有?指針沒有c++那麼靈活,也沒比java的引用好太多啊。。。

總之除了吐槽也沒然後了,今年正好又來了興緻,索性認真學一下,於是工作業餘時間搞了一個小項目:

EasyProxy:xsank/EasyProxy

把array,slice,channel,map,struct,interfae...全都用了一遍,把工程中需要用到的配置文件,日誌,socket,http,json等也都搞了一遍

在這個小應用第一版結束時對golang的感覺比較清晰了,而不像之前僅僅看書那樣有點模糊

總之:對程序員來說,對寫代碼就對了


用心去理解Golang的語言特性,它的優勢和劣勢; 清晰了解項目的需求,加上一些架構的思想,就能做出滿足項目要求軟體。


我之前做過php, java. 語言, 工具而已, 用得多自然就會了, 我常和朋友開玩笑說學一門新語言知道for循環你就會了, 當然肯定沒那麼簡單, 你知道for循環的話至少要知道 變數定義與初始化, if else, 數組.

map肯定是要會的. 對於golang的interface, struct, goroutine 都要有了解

而golang的標準庫在用的時候去查.

這種基本的語法剛開始不必太糾結, 也不用去背, 了解上面的最多半天就搞定了吧.

然後, 就要自己做東西來加深對golang的使用程度了, 可以自己用golang做個網站, 或做個網站爬蟲, 如果是學生何不用golang代替C做作業呢.

--------------

關鍵還是思路, 語言只是工具(用久了自然就熟, 很久不用也就生了). 當然要深入golang源碼就除外了.


我會建議題主學Java或C#。現有的Go的大部分資料都是給有相關經驗的開發人員看的,比如已經知道了什麼是結構體,什麼是介面,對數據類型有概念的人。相反,java和C#由於已經出來很多年了,有很多適合0基礎的人看的書


Go語言極速入門手冊.go


從1.0之前就開始關注Go語言,當時的資料還不多,主要是看官方的文檔。現在各種學習資源都有,選擇起來方便很多。

首先如果有C的基礎,推薦《Go by Example》,通篇基於代碼講解,通俗易懂,沒廢話。花上一個周末的時間,很快就能自己動手開始寫Go代碼。

之後可以看看相關創始人的博客,比如《research!rsc: Go Data Structures: Interfaces》,加深對Go語言內部機制的理解。最好還能補一下並發的相關知識(比如自旋鎖、互斥鎖等等的概念),雖然不一定用得上,但知道的話日後調試代碼能省不少時間。

有空的話還可以讀讀The Go Programming Language Specification,我覺得這可以算是最易懂的幾份Language Specification。

這些都做過的話,對Go語言方方面可以說都有了解了,剩下就是多寫,多看。相比其他語言,Go語言還是挺好學習的。


推薦閱讀:

Visual Studio 2013 怎樣新建 Windows Phone 8 項目?
寢室五人準備買衛衣,我們想每個人的衣服上都印上一小段代碼的,低調有內涵的那種。?
非計算機專業,如何學習開發、網路和資料庫知識?
最近在學c語言單片機,感覺好難阿,我該怎麼辦?

TAG:編程語言 | 編程 | 編程入門 | Go語言 |