Go語言學習 初篇

最近閒來無事,學習了下go語言。 前後看了《The Way to Go》和《Go in Action》, 前者讓我對Go語言有了基本的瞭解, 然後者做者的文風讓我深深陷入了Go的學習之中。因此計劃未來一段時間深刻學習和使用下Go這個偉大的語言。php

我是一個菜鳥,對C系編程語言有過接觸,但都是半途而廢, 只因本身基礎不夠,沒法深刻到C系語言的精髓之處。 學習go也是想彌補本身編程體系中缺失的一部分, 曾經想用C彌補,感受不是我所能深刻的。 而接觸到go,感受到了但願。html

我的對編輯器和各類複雜操做界面的工具都不敏感, 不太會使用它們。 而我本身學習理解語言的習慣又是喜歡羣追到底, 特別是每一個細節我寧肯深刻到internal也要搞懂。 曾經我也搞vim去讀過nginx, php源代碼, 但過程是至關艱辛,讀的那段時間還能略懂一二,長時間不復習,就不知所云了。 vim相比當前流行的集成編輯器仍是有些雞肋,但我鍾愛, 沒有辦法。 Go語言就很是適合我這種菜鳥, 至少我但願瞭解internal的時候,全部的源代碼我均可以從本機讀到,全部的文檔我也能夠從本機命令中獲取。 因此本文全部觀點僅限於我的喜愛, 不存在黑某些語言,推崇Go語言的問題。linux

此文爲本人學習Go語言和記錄學習過程的開篇之做。 所以首先引用一些事實和大神的話,爲文章撐撐場面。nginx

Go語言的創立

Go語言是2007年由Rob Pike, Robert Griesmier, Ken Thompson三我的啓動的一項試驗,結合他們十多年的工做經驗,立志在現有語言啓發基礎上,建立的一種新的系統語言。自己這些人都是Unix領域的大神,之前都負責過Unix, Plan 9, B, Java的JVM Hotspot, V8, Strongtalk, Sawzall, Ed, Acme以及UTF8項目,都是鼎鼎有名的巨匠。 他們2007年以一種很是純的心態走到一塊兒,啓動了Go語言這個偉大項目。git

衆所周知,計算機領域發展迅速,特別是硬件發展很是快。 早些年,咱們使用的計算機存儲只有幾兆,網速也只有幾K,CPU也只是單核。 而如今再看看,手上拿的手機,隨便一個均可以達到4核、8核,內存也遠比原來的PC機要大上數個量級。 可見計算機硬件發展之迅猛。 然而縱觀編程語言的發展,C語言從其出道一直到如今都是緩步發展,雖然出現了C++之類的高級語言,但本質上仍是基於早些年的計算機架構實現的語言系統, 面對當今的計算機硬件來講,感受力不從心,徹底沒有能力充分利用現代計算機的全部資源。所以也是鑑於這個出發點,三位大神啓動了Go語言的研發。github

Go語言在現成的語言中吸收了不少理念:golang

  • Go語言的基本語法、簡單結構取自C系語言。
  • Go語言的接口繼承來自Java系語言。
  • Go語言包的定義取自Java、C#之類的語言。
  • Go語言的多態與繼承無關的特性來自於Javascript、Ruby等其餘動態語言。
  • Go語言的通訊序列過程採用來自Limbo語言。

雖然Go語言集多種語言特性而成,但並不是臃腫難用。相反,Go語言具備很是輕便、上手容易、開發便捷、編譯快速等特色。編程

在Google團隊中,大量的C項目,編譯速度之慢讓人難以忍受。 而Java, .net來講,執行效率又相對不高。 對於動態語言來講,開發效率高,但執行速度就很是通常了。 Go語言能夠作到編譯快速、執行高效、開發便捷。 這其實有賴於三個創始人最初的理念: 在安全、高效和開發難度之間綜合評估獲得的完美平衡。vim

Go語言設計原則

Go語言設計的時候遵循了不少原則:數組

  • 用最少的關鍵詞: Go語言只有25個關鍵詞。 這樣能夠簡化編碼過程的混亂和複雜度。 代碼乾淨、整潔和簡潔。 編譯速度也能夠很快, 由於編譯過程當中關鍵詞少到徹底不用符號表來協助解析。
  • Go語言爲解決某個問題僅提供一到兩個方法, 讓代碼開發易讀、易理解。畢竟代碼是寫給人看的,不是寫給機器看的。

總結一句話就是: 簡單、簡潔、簡化、整齊、乾淨、標準。

Go語言的受衆

對於有必定其餘語言的編程經驗,很容易轉到Go語言領域。對於C語言、Java語言、PHP、Python、Ruby、Javascript等編程開發者都很容易加入到Go的行列。

Go語言特性

  • Go語言天生是解決併發編程的。
  • Go語言沒有類和繼承的概念, 它經過接口實現多態。它是一種清晰易懂、輕量級類型系統,類型之間沒有層次之說。能夠說是一種混合型的語言。
  • Go語言的基礎構件是函數, 使用很是靈活。能夠充分利用函數式編程的理念。
  • Go語言使用靜態類型,所以是類型安全的語言。
  • Go語言構建本地代碼,程序執行速度很是快。
  • Go語言是強類型語言,隱式類型轉換是不容許的。一條原則: 全部都是顯示的。
  • Go語言還有一些其餘動態語言的特性(var聲明變量), 這對於恐懼Java、.Net類型語言的開發者來講是極大福音。
  • Go語言支持交叉編譯。 並且是一門徹底支持UTF-8的編程語言, 不只體如今處理字符串,還包括源代碼文件都是UTF-8的,作到真正的國際化。
  • Go語言經過包來管理小的功能模塊。能夠經過go get獲取外部包。

Go語言缺失的特性

  • 爲了簡化設計, 不支持函數重載荷操做符重載。
  • 爲了不在C/C++開發中出現的一些Bug和混亂,不支持隱式轉換。
  • Go語言經過另外的方式實現面向對象設計,放棄了類和繼承。
  • Go語言能夠經過接口實現相似變體類型的功能,但自己不支持變體類型。
  • Go語言不支持動態加載代碼。
  • Go語言不支持動態連接庫。
  • Go語言不支持範型。
  • Go語言經過recover和panic來替代異常機制。
  • Go語言不支持斷言。
  • Go語言不支持靜態變量。

Go語言解決的痛點

有過大型Java項目或C項目開發經驗的人來講,感受遇到解決併發問題時,代碼難度之高,潛在bug之多不足爲怪。我也曾接觸過Java和C,也曾躊躇滿志想深刻二者或其中之一,可是最終都被裏邊複雜的編程拒之門外。

我挑選了簡單的PHP, Python, Javascript語言入手,可爲了深刻技術,不能深刻併發編程領域,深感遺憾。習慣了ES六、Python的開發,再想深刻到繁雜的Java、C開發,真是力有餘而心不足。

自從接觸到Go語言,我激動了, 我看到了但願。

  • Go語言開發效率能夠和我慣用的Python、PHP、Javascript達到一致。特別是一向以VIM做爲編輯器和編譯器的我,感受到史無前例的激動。 由於我能夠僅僅用我最熟悉的編輯器來實現編譯型高級語言的書寫。
  • Go語言自帶併發解決,它提供的goroutine, 徹底可讓我拋棄掉那些高端的多線程、多進程編程概念。並且得益於defer、go關鍵詞,我徹底能夠將複雜的功能以順序執行的流程來完成,須要的時候添加go來實現goroutine, defer來執行完釋放不須要的資源。
  • Go語言自帶垃圾處理。 這點讓我能夠避開枯燥難懂的垃圾處理,能夠像寫PHP同樣,毫無顧忌的書寫代碼,而不擔憂內存泄漏。
  • Go語言的類型系統簡單到能夠尖叫。 由於它的類型系統實在太簡單了,我徹底不須要爲了實現某些功能而事先花費大量的心力來了解相似C語言、Java語言之類的類型系統。 由於Go語言中的類型就是現實世界的徹底簡化:整數、布爾值、字符串、數組、分片、映射、接口、結構體和函數。
  • Go語言沒有繼承和類,而它提供了組合的概念,咱們能夠實現多態。 由於它有接口,徹底能夠相似的動態類型。

Go語言工具集

編輯器

工欲善其事,必先利其器。 學習和開發任何語言都離不開本身駕輕就熟的編輯器。對於編程語言所需的編輯器須要有下面的特色:

  • 語法高亮: 這點固然很重要,不少工具都提供了配置和設置文件來知足這個目的,更好的是能夠選擇或定製不一樣的顏色方案。
  • 代碼自動保存: 這點我的以爲無關緊要,固然擔憂忽然斷電或開發過程當中突發異常,辛苦的代碼丟失是很是讓人惱火的, 有這方面擔憂的仍是保留這個需求吧。
  • 行號顯示: 代碼開發時,顯示行號很是重要,能夠方便咱們在代碼內容中查看做爲參考。
  • 良好的代碼結構審閱和導航: 畢竟項目都是由大量目錄和文件組成的,有一個良好的導航會讓咱們的工做效率更高。
  • 便捷的查找和替換功能: 在實際開發中,咱們常常須要搜索特定關鍵詞,例如查找某個功能的定義出處和含義,另外咱們還可能在開發過程當中須要對某些變量名進行替換,那麼須要替換掉項目中全部使用到該變量引用的地方。 方便的查找和替換功能不可缺乏。
  • 快捷的註釋/取消註釋掉選擇的代碼區塊: 開發過程當中,因爲調試或測試的緣由,頗有可能須要註釋或取消註釋一段代碼區域,若是能很便捷的實現這些操做,有助於事半功倍。
  • 編譯錯誤提示: 編譯錯誤最好能高亮並指出代碼所在文件和行的信息。
  • 跨平臺: 項目開發和項目部署大部分時間來講都是不一樣的,若是編輯器能支持跨平臺編譯再好不過了。
  • 最好免費: 畢竟掙錢不易,固然遇到超級棒的收費工具,能幫咱們帶來更多利益和便捷,咱們也能夠支付必定費用給軟件方,畢竟他們作這些工具也很辛苦,給咱們提供了便利,咱們也應適當的支持下對方的工做嘛。
  • 最好是開源的: 由於當你很是熟悉你的IDE的時候,你但願編輯器能提供更多你自定義的特性,而這些特性提供方不可能爲你那麼個性的需求作定製的,那麼你就本身來定製吧。
  • 插件架構: 編輯器採用插件架構,能夠方便擴展,也可使用新的插件來替換某個功能。
  • 便於使用: 這點最關鍵,編輯器畢竟是工具,爲的是提升你的生產效率。 好用是關鍵, 其餘的都是浮雲。 若是你用記事本能搞定一切,就不要用吃內存不少,佔用CPU更厲害的其餘集成編輯器了。
  • 代碼模版: 這個功能的支持,我我的以爲在學習階段不是必須,可是在實際開發過程當中,爲了提升開發效率,有代碼模版也是不錯的選擇。 在必定程度上仍是能大大提升開發效率的。
  • 調試功能: 斷點、監測值、逐步執行代碼、跳過標準庫代碼等調試相關的功能。
  • 智能代碼補全
  • 最近項目和代碼記錄
  • 內置go工具: 例如go fat, go fix, go install, go test等等。
  • 和版本控制集成: 好比集成git,svn等。

下面簡單列舉下Go語言編輯利器。

其餘工具

以上只是本人的一些初步理解和認識,還有不少激動人心的特色,值得咱們深刻了解。

本文僅用於我的學習,裏邊看法僅我的理解,若有不對,敬請不吝賜教(本人是菜鳥一個)

個人文章

Go In Action翻譯

相關文章
相關標籤/搜索