使用Go語言一段時間的感受

作者: Windstorm  發布時間: 2012-03-04 16:56  閱讀: 4246 次  推薦: 3   原文鏈接   [收藏]  

  有一段時間沒更新了。最近在忙一個 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 是另一個我欣賞的語言,問題是不跨平臺,過于封閉。

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

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

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

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

  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 的海洋吧。

  相關博文:我為什么喜歡 Go 語言

3
0
 
標簽:Go
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()