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

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


最近在忙一個Server+Client的項目,Client是Android手機,大概也就是幾十的規模。Server是純Go語言實現,沒有apache或者ngix這種web server,也沒有資料庫,自己寫了個檔案管理module,處理這種小規模的服務沒問題。算下來接觸Go語言也有四個多月了,斷斷續續寫了一些東西,這裡記錄一下心得吧。

先大概說下為什麼用Go語言。我是一個對語言有潔癖的人,曾經是一個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。

Go語言是一個新語言,截至目前為止,第一版正式版還沒有發布。Go語言的設計者是Robert Griesemer, Rob Pike和Ken Thompson,當年設計C和Unix,後來的Plan9團隊中的人 。Go語言的設計理念很明確,就是將動態類型語言的編程容易度和靜態類型語言的安全效率結合起來。如果你想更深入瞭解Go語言的發展曆史以及完整的目標,請參考Go語言 FAQ。

當然,Go語言吸引我的地方,不是因為其是Google出品,也不是因為其設計者皆為大牛,而是因為,Go語言真的做到了它所宣稱的目標。Go語言就如同C和Python中間的完美結合,如果你是Python愛好者,又追求代碼的速度和並行化,那麼簡單說,Go語言就是為你設計的。Go語言有很濃厚的C的遺風,盡量屏蔽C++和Java的影響,比如沒有獨立的OO體系(並不是說不能OO),一切以struct為中心,沒有exceptions(Oh yes!),仍然有指標,等等。但是,Go語言又吸取了很多新語言的精華,並帶有自己獨特的設計。比如

1. 保留但大幅度簡化指標

Go語言保留著C中值和指標的區別,但是對於指標繁瑣用法進行了大量的簡化,引入引用的概念。所以在Go語言中,你幾乎不用擔心會因為直接操作內寸而引起各式各樣的錯誤。

2. 多參數返回

還記得在C裡面為了回饋多個參數,不得不開闢幾段指標傳到目標函數中讓其操作嗎?在Go裡面這是完全不必要的。而且多參數的支援讓Go無需使用繁瑣的exceptions體系,一個函數可以返回期待的傳回值加上error,調用函數後立刻處理錯誤資訊,清晰明了。

3. Array,slice,map等內建基本資料結構

如果你習慣了Python中簡潔的list和dict操作,在Go語言中,你不會感到孤單。一切都是那麼熟悉,而且更加高效。如果你是C++程式員,你會發現你又找到了STL的vector 和 map這對朋友。

4. Interface

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

同時,正因為如此,Go語言的interface可以用來表示任何generic的東西,比如一個空的interface,可以是string可以是int,可以是任何資料類型,因為這些資料類型都不需要實現任何函數,自然就滿足空interface的定義了。加上Go語言的type assertion,可以提供一般動態語言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯誤。

5. OO

Go語言本質上不是物件導向語言,它還是過程化的。但是,在Go語言中, 你可以很輕易的做大部分你在別的OO語言中能做的事,用更簡單清晰的邏輯。是的,在這裡,不需要class,仍然可以繼承,仍然可以多態,但是速度卻快得多。因為本質上,OO在Go語言中,就是普通的struct操作。

6. Goroutine

這個幾乎算是Go語言的招牌特性之一了,我也不想多提。如果你完全不瞭解Goroutine,那麼你只需要知道,這玩意是超級輕量級的類似線程的東西,但通過它,你不需要複雜的線程操作鎖操作,不需要care調度,就能玩轉基本的並行程式。在Go語言裡,觸發一個routine和erlang spawn一樣簡單。基本上要掌握Go語言,以Goroutine和channel為核心的記憶體模型是必須要懂的。不過請放心,真的非常簡單。

7. 更多現代的特性

和C比較,Go語言完全就是一門現代化語言,原生支援的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。

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

有朋友要抗議了,你把Go語言吹的這麼好,難道它就沒有缺點?有,當然有,不過和它的優點比,我覺得很多缺點都是因為整個語言太新,不成熟,隨著時間的推移都能得到解決,相比之下都能忍了。如果你希望進一步瞭解Go語言的優缺點,可以參考以下yufeng寫的這篇文章,系統程式設計語言明日之星—Go(http://blog.yufeng.info/Go.pdf。

還有朋友要說,Go語言這麼好,為什麼沒人用?我想說,眼界放開點,這個世界精彩的東西比你想象的多。Go語言被Google用於Youtube的資料庫,被越來越多的國外公司(大部分創業公司)用於後端開發,甚至在天朝,也有完全用Go語言做服務開發的雲應用公司了。可以說,隨著Go 1即將到來的正式推出,Go語言的使用範圍,應該會越來越廣。

總結

如果你是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的愛好者,對動態語言又沒有特殊的熱愛……我還需要說什麼呢?

讓我們蕩起雙槳,去遨遊Go語言的海洋吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.