有一段時間沒更新了。最近在忙一個Server+Client的項目,Client是Android手機,大概也就是幾十的規模。 Server是純Golang實現,沒有apache或者ngix這種web server,也沒有數據庫,本身寫了個文件管理module,handle這種小規模的服務沒問題。算下來接觸Golang也有四個多月了,斷斷續續寫 了一些東西,這裏紀錄一下心得吧程序員

先大概說下爲何用Golang。我是一個對語言有潔癖的人,曾經是一個c+Python的堅決吶喊者,最常說的一句話就是,只要熟練這兩種,什麼 狀況都能應付,根本不用Java和C++(純指我所在的領域)。核心代碼用c,速度快,須要記的語言細節少;外圍用Python glue,靈活,簡潔,任何模塊都容易上手,絕配。Java的繁瑣,C++的無數無用的特性,都讓我只在不得不用的時候纔去用。Objective-C是 另外一個我欣賞的語言,問題是不跨平臺,過於封閉。golang


惋惜的是,在這個節奏極快的時代,不是全部狀況下都適合上c。以前有一個項目也是相似的架構和規模,爲了節省時間,當初幾乎沒有服務器平臺編程經驗的我, 在服務器端選擇用Django+Apache+MySQL作,成熟,社區活躍,又是python做爲主要開發語言,這些都是這個選擇的緣由。說實話,幾個 月過去後,回首看,這不是一個愉快的經歷。Django是一個好架構,大而全,而大而全有時也就意味着臃腫,五花八門的配置,過緊的模塊耦合對引入第三方 工具限制頗多,自帶的ORM又很差用。以前歷來沒有搞過服務器配置的我,對Apache的配置和效率所帶來的瑣碎的東西也頭疼。總的來講這個部分花了我很 多時間,有新手學習服務器編程的必通過程,也有折騰Django和Apache不必的時間浪費,很大部分上抵消了Python帶來的快速開發的靈活性。 而一旦服務器上線,動態語言帶來的一些bug又會讓人頭疼。對於普通高校實驗室這種沒有完善的服務器調試的條件,基本就是改了就上線用,有些隱蔽bug到 某些條件分支纔會觸發,一旦在運行中途出問題,改起來也麻煩。web

從那時起,我就特別想,要是有一種語言能把c和Python的優勢結合起來,也就是說數據庫

  • 速度快,高性能
  • 簡潔明瞭,須要記的語言細節少,開發迅速(c)
  • 靈活,開發快速,類Python的list,map等經常使用數據結構支持(Python)
  • 完善的模塊支持,模塊也容易上手(Python)
  • 對程序員友好的並行架構(Erlang)
  • 安全,絕大部分問題能消滅在compile time中(C minus pointer)

那基本就是系統級和網絡級編程最對我胃口的語言了。而後我就找到了Goapache

Golang是一個新語言,截至目前爲止,初版正式版尚未發佈。Golang的設計者是Robert Griesemer, Rob Pike和Ken Thompson,當年設計C和Unix,後來的Plan9團隊中的人 。Golang的設計理念很明確,就是將動態類型語言的編程容易度和靜態類型語言的安全效率結合起來。若是你想更深刻了解Golang的發展歷史以及完整 的目標,請參考Golang FAQ編程

固然,Golang吸引個人地方,不是由於其是Google出品,也不是由於其設計者皆爲大牛,而是由於,Golang真的作到了它所宣稱的目標。 Golang就如同C和Python中間的完美結合,若是你是Python愛好者,又追求代碼的速度和並行化,那麼簡單說,Golang就是爲你設計的。 Golang有很濃厚的C的遺風,儘可能屏蔽C++和Java的影響,好比沒有獨立的OO體系(並非說不能OO),一切以struct爲中心,沒有 exceptions(Oh yes!),仍然有指針,等等。可是,Golang又吸收了不少新語言的精華,並帶有本身獨特的設計。好比後端

1. 保留但大幅度簡化指針安全

Golang保留着C中值和指針的區別,可是對於指針繁瑣用法進行了大量的簡化,引入引用的概念。因此在Golang中,你幾乎不用擔憂會由於直接操做內寸而引發各式各樣的錯誤。

2. 多參數返回

還記得在C裏面爲了回饋多個參數,不得不開闢幾段指針傳到目標函數中讓其操做麼?在Go裏面這是徹底沒必要要的。並且多參數的支持讓Go無需使用繁瑣的exceptions體系,一個函數能夠返回期待的返回值加上error,調用函數後馬上處理錯誤信息,清晰明瞭。

3. Array,slice,map等內置基本數據結構

若是你習慣了Python中簡潔的list和dict操做,在Golang中,你不會感到孤單。一切都是那麼熟悉,並且更加高效。若是你是C++程序員,你會發現你又找到了STL的vector 和 map這對朋友。

4. Interface

Golang最讓人讚歎不易的特性,就是interface的設計。任何數據結構,只要實現了interface所定義的函數,自動就implement了這個interface,沒有像Java那樣冗長的class申明,提供了靈活太多的設計度和OO抽象度,讓你的代碼也很是乾淨。千萬不要覺得你習慣了Java那種一條一條加implements的方式,感受還行,等接口的設計愈來愈複雜的時候,無數Bug正在後面等着你。

同時,正由於如此,Golang的interface能夠用來表示任何generic的東西,好比一個空的interface,能夠是string 能夠是int,能夠是任何數據類型,由於這些數據類型都不須要實現任何函數,天然就知足空interface的定義了。加上Golang的type assertion,能夠提供通常動態語言纔有的duck typing特性, 而仍然能在compile中捕捉明顯的錯誤。

5. OO

Golang本質上不是面嚮對象語言,它仍是過程化的。可是,在Golang中, 你能夠很輕易的作大部分你在別的OO語言中能作的事,用更簡單清晰的邏輯。是的,在這裏,不須要class,仍然能夠繼承,仍然能夠多態,可是速度卻快得 多。由於本質上,OO在Golang中,就是普通的struct操做

6. Goroutine

這個幾乎算是Golang的招牌特性之一了,我也不想多提。若是你徹底不瞭解Goroutine,那麼你只須要知道,這玩意是超級輕量級的相似線程 的東西,但經過它,你不須要複雜的線程操做鎖操做,不須要care調度,就能玩轉基本的並行程序。在Golang裏,觸發一個routine和 erlang spawn同樣簡單。基本上要掌握Golang,以Goroutine和channel爲核心的內存模型是必需要懂的。不過請放心,真的很是簡單。

7. 更多現代的特性

和C比較,Golang徹底就是一門現代化語言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language相似), function是first class object,等等等等。

看到這裏,你可能會發現,我用了不少輕易,簡單,快速之類的形容詞來形容Golang的特色。我想說的是,一點都不誇張,連Golang的入門學習 到提升,都比別的語言門檻低太多太多。在大部分人都有C的背景的時代,對於Golang,從入門到可以上手作項目,最多不過半個月。Golang給人的感 覺就是太直接了,什麼都直接,讀源代碼直接,寫本身的代碼也直接。

有朋友要抗議了,你把Golang吹的這麼好,難道它就沒有缺點?有,固然有,不過和它的優勢比,我以爲不少缺點都是由於整個語言太新,不成熟,隨 着時間的推移都能獲得解決,相比之下都能忍了。若是你但願進一步瞭解Golang的優缺點,能夠參考如下yufeng寫的這篇文章,系統編程語言明日之星 —Go(http://blog.yufeng.info/Go.pdf。

還有朋友要說,Golang這麼好,爲何沒人用?我想說,眼界放開點,這個世界精彩的東西比你想象的多。Golang被Google用於Youtube的數據庫,被愈來愈多的國外公司(大部分創業公司)用於後端開發,甚至在天朝,也有徹底用Golang作服務開發的雲應用公司了。能夠說,隨着Go 1即將到來的正式推出,Golang的使用範圍,應該會愈來愈廣。

好,總結時間

若是你是Python和動態語言狂熱愛好者,Go不必定能給你帶來很大的驚喜,這純粹取決於你得項目性質,考慮到Python目前在不少地方都用C作核心運算,速度在大部分狀況下都不是大問題。scalability是一個問題,但並非人人都會遇到的。

若是你是C愛好者,強烈建議你學習和使用Go。Go能夠調用C/C++程序,又提供了太多的便利,速度上稍有犧牲,但並不大。在絕大部分場景下Go能給你帶來媲美C的性能,而對於某些確實性能過於關鍵的場合,也能夠經過cgo讓Go和C搭配。

若是你是Java愛好者,除非你是作Android這種不得不用Java的平臺,不然也建議你嘗試學習Go,這個開發上感受的差別如同比較開載着1噸石頭的拖拉機和開保時捷911那麼明顯,而Java能給你的,Go能給得更好。

若是你是C++愛好者,!@#$%^&*,恭喜你,至少你的智商應該是沒問題的。人生苦短,趕忙脫離C++這個苦海吧。你用來學89個C++高級特性的時間,估計已經用Go寫了64個開源項目了。

若是你是像我同樣的C和Python的愛好者,對動態語言又沒有特殊的熱愛……我還須要說什麼呢?

讓咱們蕩起雙槳,去遨遊Golang的海洋吧。