golang語言介紹

Programing Language – Golang

  • Golang官網地址:https://golang.org/
  • Golang官方文檔:https://golang.org/doc/
  • Golang Packages:https://golang.org/pkg/
  • Golang中文網:https://studygolang.com/
  • Golang中文文檔:http://docscn.studygolang.com/
  • Golang中文Packages:https://studygolang.com/pkgdoc

摘要

Golang(又稱Go)是Google公司開發的一種靜態強類型、編譯型、並發型,並具有垃圾回收功能的編程語言。

羅伯特·格瑞史莫,羅勃·派克(Rob Pike)及肯·湯普遜於2007年9月開始設計GO,稍後Ian Lance Taylor、Russ Cox加入項目。Go是基於Inferno操作系統所開發的。Go於2009年11月正式宣佈推出,成為開放源代碼項目,支持Linux、macOS、Windows等操作系統。在2016年,Go被軟件評價公司TIOBE 選為“TIOBE 2016 年最佳語言”。

目前,Go每半年發佈一個二級版本(即從a.x升級到a.y)。

描述

Go的語法接近C語言,但對於變量的聲明有所不同。Go支持垃圾回收功能。Go的並行計算模型是以東尼·霍爾的通信順序進程(CSP)為基礎,采取類似模型的其他語言包括Occam和Limbo[3],Go也具有這個模型的特征,比如通道傳輸。通過goroutine和通道等並行構造可以建造線程池和管道等[8]。在1.8版本中開放插件(Plugin)的支持,這意味著現在能從Go中動態加載部分函數。

與C++相比,Go並不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能,但增加瞭 切片(Slice) 型、並發、管道、垃圾回收功能、接口等特性的語言級支持。Go 2.0版本將支持泛型[9],對於斷言的存在,則持負面態度,同時也為自己不提供類型繼承來辯護。

不同於Java,Go原生提供瞭關聯數組(也稱為哈希表(Hashes)或字典(Dictionaries)),就像字符串類型一樣。

歷史

2007年,Google設計Go,目的在於提高在多核、網絡機器(networked machines)、大型代碼庫(codebases)的情況下的開發效率。當時在Google,設計師們想要解決其他語言使用中的缺點,但是仍保留他們的優點。

  • 靜態類型和運行時效率。(如:C++)
  • 可讀性和易用性。(如:Python 和 JavaScript)[12]
  • 高性能的網絡和多進程。

設計師們主要受他們之間流傳的“不要像C++”啟發。

Go於2009年11月正式宣佈推出,[16]版本1.0在2012年3月發佈。之後,Go廣泛應用於Google的產品以及許多其他組織和開源項目。

在2016年11月,Go(一種無襯線體)和Go Mono 字體(一種等寬字體)分別由設計師 Charles Bigelow 和 Kris Holmes 發佈。 兩種字體均采用瞭 WGL4 ,並且依照著 DIN 1450 標準,可清晰地使用瞭 large x-height 和 letterforms 。

在2018年8月,本地的圖標更換瞭 。待描述完整 然而,Gopher mascot 仍舊命相同的名字。

在2018年8月,Go的主要貢獻者發佈瞭兩個關於語言新功能的“草稿設計——泛型 和 異常處理,同時尋求Go用戶的反饋。Go 由於在1.x時,缺少對 泛型編程 的支持和冗長的 異常處理 而備受批評。

以上來自wiki,更多詳情可查看

為什麼需要學習Golang?

硬件的局限性

摩爾定律正在失效。

英特爾公司在 2004 年推出瞭第一款具有 3.0 GHz時鐘速度的奔騰 4 處理器。如今,我的 2016款 MacBook Pro 的時鐘速度為 2.9 GHz。因此,差不多十年,原始處理能力都沒有太多的增加。你可以在下圖中看到處理能力的增長與時間的關系。

從上面的圖表可以看出,單線程的性能和處理器的頻率在近十年幾乎保持穩定。如果你認為添加更多的晶體管是一種解決問題的方法,那你就錯瞭。這是因為在微觀尺度上,量子特性開始顯現(例如:量子隧道穿越),放更多的晶體管代價也會越多(為什麼?),而且,每美元可以添加晶體管的數量也開始下降。

所以,針對上述問題的解決方案如下:

  • 廠商開始向處理器添加越來越多的內核。如今,我們已經有四核和八核的 CPU 可用。
  • 我們還引入瞭超線程技術。
  • 為處理器添加更多的緩存以提升性能。

但是,以上方案也有它們自身的限制。我們無法向處理器添加更多的緩存以提升性能,因為緩存具有物理限制:緩存越大,速度越慢。添加更多的內核到處理器也有它的成本。而且,這也無法無限擴展。這些多核處理器能同時運行多個線程,同時也能帶來並發能力。我們稍後會討論它。

因此,如果我們不能依賴於硬件的改進,唯一的出路就是找到一個高效的軟件來提升性能,但遺憾的是,現代編程語言都不是那麼高效。

Go 天生支持並發

如上所述,硬件提供商正在向處理器添加更多的內核以提升性能。所有的數據中心都在這些處理器上運行,我們應該期待在未來幾年內核數量的增長。更重要的是,如今的應用程序都是使用多個微服務來維持數據庫的連接、消息隊列和緩存的維護。因此,我們開發的軟件和編程語言可以更容易的支持並發,並且它們應該隨著內核數量的增長而可擴展。

但是大多數現代編程語言(如 Java、Python 等)都來自於 90 年代的單線程環境。這些語言大多數都支持多線程。但真正的問題是並發執行,線程鎖、競爭條件和死鎖。這些問題都使得很難在這些語言上創建一個多線程的應用程序。

例如,在 Java 中創建新的線程會消耗大量內存。因為每一個線程都會消耗大約 1 MB 大小的堆內存,如果你運行上千個線程,他們會對堆造成巨大的壓力,最終會由於內存不足而宕機。此外,你想要在兩個或者多個線程之間通信也是非常困難的。

另一方面,Go 於 2009 年發佈,那時多核處理器已經上市瞭。這也是為什麼 Go 是在考慮並發的基礎上構建的。Go 用 goroutine 來替代線程,它們從堆中消耗瞭大約 2 KB 的內存。因此你可以隨時啟動上百萬個 goroutine。

Go 直接在底層硬件上運行

與其他現代高級語言(如 Java/Python)相比,使用 C、C++ 的最大好處就是它的性能,因為 C/C++ 是編譯型語言而不是解釋型語言。

處理器能理解二進制文件。通常來說,當你編譯一個用 Java 或者其他基於 JVM 的語言構建的應用程序,它將人類可讀的代碼編譯為字節代碼,這可以被 JVM 或者在底層操作系統之上運行的其他虛擬機所理解。當執行的時候,虛擬機解釋這些字節碼並且將他們轉化為處理器能理解的二進制文件。

用 Go 編寫的代碼易於維護

我告訴你一件事,Go 沒有像其他語言一樣瘋狂於編程語法,它的語法非常整潔。

Go 的的設計者在谷歌創建這門語言的時候就考慮到瞭這一點,由於谷歌擁有非常強大的代碼庫,成千上萬的開發者都工作在相同的代碼庫上,代碼應該易於其他開發者理解,一段代碼應該對另一段代碼有最小的影響。這些都會使得代碼易於維護,易於修改。

Go 有意的忽視瞭許多現代面向對象語言的一些特性。

  • 沒有類。 所有代碼都僅用 package 分開,Go 隻有結構體而不是類。
  • 不支持繼承。 這將使得代碼易於修改。在其他語言中,如: Java/Python,如果類 ABC 繼承類 XYZ 並且你在類 XYZ 中做瞭一些改動,那麼這可能會在繼承類 XYZ 的其他類中產生一些副作用。通過移除繼承,Go 也使得理解代碼變得很容易 (因為當你在看一段代碼時不需要同時查看父類)。
  • 沒有構造方法。
  • 沒有註解。
  • 沒有泛型。
  • 沒有異常。

以上這些改變使得 Go 與其他語言截然不同,這使得用 Go 編程與其他語言很不一樣。你可能不喜歡以上的一些觀點。但是,並不是說沒有上述這些特性,你就無法對你的應用程序編碼。你要做的就是多寫幾行代碼,但從積極的一面,它將使你的代碼更加清晰,為代碼添加更多的清晰度。

Go 來勢洶洶

  • 我知道這不是一個直接的技術優勢,但 Go 是由谷歌設計並支持的,谷歌擁有世界上最大的雲基礎設施之一,並且規模龐大。谷歌設計 Go 以解決可擴展性和有效性問題。這些是創建我們自己的服務器時都會遇到的問題。
  • Go 更多的也是被一些大公司所使用,如 Adobe、BBC、IBM,因特爾甚至是 Medium。
赞(0)