【Go 語言入門專欄】Go 語言的起源與發展

K哥爬虫發表於2024-04-30

00

前言

Go 語言是當下最為流行的程式語言之一,大約在 2020、2021 年左右開始於國內盛行,許多大廠很早就將部分 Java 專案遷移到了 Go,足可看出其在效能方面的優越性。

相信各位都知道,在爬蟲業務中,併發是一個關鍵的需求,不然僅靠單執行緒採集資料,只怕公司垮了資料都還沒采完。以往編寫爬蟲指令碼,通常會使用 Python 語言,不過,想用 Python 實現較好的併發效能,相對麻煩,並且容易受到伺服器或電腦配置的影響。相較之下,Go 語言天然的支援輕量級執行緒(goroutine)和通道(channel),這使得併發程式設計變得非常簡單,也更為穩定。比之 Python,Go 還有很多優勢,並且,時至今日,各開源社群的大佬們也貢獻了許多優秀的 Go 語言爬蟲庫及框架,例如 colly、goquery、requests-go 等等,相關生態越來越好。

現在很多公司要求使用 Go 語言編寫爬蟲指令碼,以往的 Python 程式也會逐步遷移。Boss 直聘上,在一些公司爬蟲崗的職位描述裡,也要求能夠熟練使用 Go 語言:

01

由此看來,Go 語言正在逐步成為日常工具,被廣泛運用於後端開發和爬蟲中,所以學習 Go 語言是很有必要的,無論目前是否是剛需,都值得儲備相關知識。

為此,K哥新開《Go 語言入門專欄》,提供給大夥一個新的學習途徑。

簡介

Go 語言(也稱為 Golang)是一種由 Google 開發的開源程式語言。

過去,許多開發者在使用 C++ 來開發大型的服務端軟體時,由於二進位制檔案一般都非常大,需要耗費大量的時間在編譯檔案上,同時程式語言的設計思想也已經非常陳舊,這些情況都充分表明了現有的程式語言已不符合時下的生產環境。

學者們坐下來總結出了現在生產環境與軟體開發之間的主要矛盾,並嘗試設計一門全新的程式語言來解決這些問題。他們討論得出的對程式語言的設計要求:

  • 能夠以更快的速度開發軟體
  • 開發出的軟體能夠很好地在現代的多核計算機上工作
  • 開發出的軟體能夠很好地在網路環境下工作
  • 使人們能夠享受軟體開發的過程

Go 語言就在這樣的環境下誕生了,它的主要目標是“兼具 Python 等動態語言的開發速度和 C/C++ 等編譯型語言的效能與安全性”。

Go 語言出現的目的是在程式設計領域中創造出最實用的方式來進行軟體開發。它並不是要用奇怪的語法或晦澀難懂的概念來從根本上推翻已有的程式語言,而是重建並改善了 C、C#、Java 中的許多語法風格。

起源

Go 語言的起源可以追溯到 2007 年。

在 2007 年的時候,谷歌開發工作的規模與正在部署的生產系統規模暴增,需要有個好的解決方案應對這些挑戰。

當時 Robert Griesemer、Rob Pike 和 Ken Thompson 都是用的 C++,編譯一個分散式叢集大概要花費 45 分鐘,這個過程讓三個人都很難以忍受。

XKCD 中的一幅漫畫

2007 年 9 月 20 日星期四下午,在等待編譯的時候 Rob Pike 把 Robert Griesemer 和 Ken Thompson 喊到一起決定要做些什麼:他們不想永遠使用 C++,並且想要很好處理併發的問題。希望創造一個能夠摒棄其他語言的缺點的新語言,保持靜態型別和執行時效率、具有可讀性和可用性、具備高效能網路和併發處理。

Go 這個名字是 Rob Pike 取的,認為它很短、易於輸入,非常合適這一新語言的特性。

最初的一週內,他們就討論出來了很多 Go 語言的風格和特性,並著手開發。

經過兩年的努力,於 2009 年 11 月,Google 宣佈了 Go 語言的首個公開發布版本,即 Go 1。

大佬三連坐:

Robert Griesemer、Rob Pike 、Ken Thompson(2012年,Google I/O大會)

頂級初創團隊:

① Robert Griesemer,參與開發 Java HotSpot 虛擬機器,並負責 Chrome 瀏覽器和 Node.js 使用的 Google V8 JavaScript 引擎的程式碼生成部分。

② Rob Pike,Go 語言專案總負責人,貝爾實驗室 Unix 團隊成員,參與的專案包括 Plan 9,Inferno 作業系統和 Limbo 程式語言。

③ Ken Thompson,貝爾實驗室 Unix 團隊成員,C 語言、Unix 和 Plan 9 的創始人之一,與 Rob Pike 共同開發了 UTF-8 字符集規範。

隨著更多有才華的程式設計師加入到 Go 開發團隊中,更多貢獻者開始為 Go 語言專案添磚加瓦。使得 Go 在釋出的當年就成為了著名程式語言排行榜 TIOBE 的年度最佳程式語言。

Go 釋出後就吸引了一些公司,尤其是雲端計算領域的初創公司成為了 Go 語言的早期接納者。在經過若干年的磨合後,在這些公司中誕生了不乏像 Docker(容器引擎)、Kubernetes(雲原生事實標準平臺)、Ethereum(區塊鏈公鏈以太坊)等“殺手級”或示範性專案,這些專案也讓 Go 被譽為雲端計算基礎設施新興語言或直接稱為雲端計算語言

Go 在近些年雲原生領域的廣泛應用也讓其躋身雲原生時代的頭部程式語言。

Logo 的誕生

在 Go 立項的時候,Rob Pike 的妻子 Renee French(著名美國插畫師、漫畫家和作家,以其獨特的風格和奇特的創意而聞名)就幫他們畫了一個標誌,然後這個圖示就出現在 Google Code 網站和第一件 Go T 恤上,該 Logo 被用來體現 Go 的速度:

04

2009 年 11 月 10 日 Go 準備開源釋出的之前,Rob Pike 的妻子建議,將她在 1999 年左右為新澤西州 WFMU 廣播電臺年度籌款活動設計的,作為宣傳的形象,改編成為 Go 的吉祥物 ------ Gopher(地鼠):

big gopher

發錯了,是這個 ~(~ ̄▽ ̄)~:

06

之後,Rob Pike 的妻子又繪製了更多的 Go gopher 形象,代表著 Go 專案和各地的 Go 程式設計師。這些可愛的形象成為 Go 世界中最受歡迎的事物之一,被世界各地的 Go 程式設計師廣泛使用:

Go Gopher

發展歷程

  1. 初期版本(2009 年 - 2012 年):

    初期版本的 Go 語言主要集中於提供簡潔、高效的程式設計體驗,以及強大的併發支援。這些特性使其成為了雲服務、網路應用和大規模分散式系統開發的理想選擇。

  2. Go 1 釋出(2012 年):

    Go 1 是 Go 語言的首個穩定版本,也是第一個被廣泛用於生產環境的版本。釋出 Go 1 的目標是提供穩定的 API 和 ABI,以便未來版本的相容性。

  3. 生態系統的發展(2012 年 - 至今):

    隨著 Go 語言的發展,其生態系統也在不斷壯大。包括標準庫、第三方庫、框架以及工具鏈在內的生態系統都得到了極大的豐富和改進,使得 Go 語言更加適用於各種型別的應用開發。

  4. Go 語言在工業界的應用(2010 年至今):

    自從 Go 語言釋出以來,越來越多的公司和組織開始採用 Go 語言進行開發。一些知名的公司,如 Google、Uber、Dropbox、Docker、Cloudflare、MongoDB 等,都在生產環境中使用 Go 語言開發核心系統。

  5. 版本更新和改進(2012 年至今):

    Go 語言的開發團隊持續不斷地釋出新的版本,以改進語言的效能、穩定性和功能。Go 社群也積極參與到語言的發展中,提出改進建議、修復 bug,並貢獻各種開源專案。

TIOBE 指數中的 Go 語言發展曲線

版本迭代

04

官方釋出歷史:https://go.dev/doc/devel/release

特性

① 簡潔易學

Go 語言的語法設計簡潔明瞭,摒棄了一些繁瑣的特性和語法元素,使得程式碼更易於閱讀和維護。這使得 Go 語言成為一門學習曲線較為平緩的程式語言,即使是沒有程式設計經驗的人也能相對輕鬆地上手。

② 高併發效能

Go 語言天生支援併發程式設計,透過 goroutine 和 channel 機制,使得併發程式設計變得非常簡單。

傳統程式語言(如 C、C++ 等)的併發實現,實際上就是基於作業系統排程的,即程式負責建立執行緒(一般透過 pthread 等函式庫呼叫實現),作業系統負責排程。這種傳統支援併發的方式主要有兩大不足:複雜與難於擴充套件。

為了解決這些問題,Go 果斷放棄了傳統的基於作業系統執行緒的併發模型,而採用了使用者層輕量級執行緒或者說是類協程(coroutine),Go 將之稱為 goroutine。

goroutine 佔用的資源非常少,Go 語言執行時預設為每個 goroutine 分配的棧空間僅 2KB,會自動在配置的一組邏輯處理器上排程執行 goroutine。每個邏輯處理器繫結到一個作業系統執行緒上。這讓使用者的應用程式執行效率更高,而開發工作量顯著減少。

goroutine 排程的切換也不用陷入(trap)作業系統核心層完成,代價很低。因此,在一個 Go 程式中可以建立成千上萬個併發的 goroutine。所有的 Go 程式碼都在 goroutine 中執行,哪怕是 Go 的執行時程式碼也不例外。

而 channel(通道)則提供了不同 goroutine 之間的通訊和同步機制,使得編寫併發程式碼變得直觀而安全,可以幫助使用者避免在其他語言裡常見的共享記憶體訪問的問題。

③ 快速編譯

Go 語言的編譯速度非常快,這得益於其先進的編譯器和最佳化器。快速的編譯速度可以大大提高開發效率,特別是在大型專案中。

④ 記憶體管理

Go 語言擁有自動記憶體管理功能,也就是垃圾回收機制。這意味著開發者不需要手動管理記憶體分配和回收,大大減輕了程式設計的負擔,同時也有助於防止記憶體洩漏。

⑤ 靜態型別語言

Go 語言是一門靜態型別的程式語言,這意味著在編譯期間就能捕獲到一些型別相關的錯誤。靜態型別檢查有助於提前發現潛在的 Bug,減少在執行時可能出現的錯誤。

⑥ 跨平臺支援

Go 語言的編譯器可以在多種平臺上執行,可以輕鬆地將 Go 程式編譯成適用於不同作業系統和硬體架構的可執行檔案。這使得 Go 語言成為跨平臺開發的理想選擇。

⑦ 強調並遵循軟體工程原則

Go 語言鼓勵開發者編寫清晰、簡潔、可維護的程式碼。它有一套明確的程式碼風格規範,並自帶了一些工具來幫助開發者保持一致的程式碼風格。

⑧ 豐富的標準庫

Go 語言附帶了豐富而強大的標準庫,覆蓋了網路、檔案處理、加密、併發等方面。開發者可以直接使用標準庫提供的功能,而無需引入大量的第三方庫。

⑨ 工具鏈

完整的工具鏈對於日常開發極為重要。Go 在此做得相當不錯,無論是編譯、格式化、錯誤檢查、幫助文件,還是第三方包下載、更新都有對應的工具。其功能未必完善,但起碼算得上簡單易用。

內建完整測試框架,其中包括單元測試、效能測試、程式碼覆蓋率、資料競爭,以及用來調優的 pprof,這些都是保障程式碼能正確而穩定執行的必備利器。

除此之外,還可透過環境變數輸出執行時監控資訊,尤其是垃圾回收和併發排程跟蹤,可進一步幫助我們改進演算法,獲得更佳的執行期表現。

⑩ 文件資源

Go 語言擁有豐富的官方文件資源,包括語言規範、標準庫文件、命令列工具說明等。此外,Go 語言社群中也有許多優秀的教程、部落格和論壇,為開發者提供了學習和交流的平臺。

Less is exponentially more

效能測評

以下是 Go 語言與其他程式語言的對比測試資料(源於網路資料):

  • 在相同的環境和執行目標的情況下,Go 程式比 Java 或 Scala 應用程式要快上 2 倍,並比這兩門語言使用少佔用 70% 的記憶體,執行效率大約比 C++ 慢 20%;
  • Go 的編譯速度要比絕大多數語言都要快,比 Java 和 C++ 快 5 至 6 倍,比 Scala 快 10 倍;
  • Go 語言透過垃圾回收器自動管理記憶體,這在某些情況下可能會引入一些執行時開銷。相比之下,C/C++ 需要手動管理記憶體,這可能會導致記憶體洩漏和懸掛指標等問題;
  • Go 和 Python 在一般開發的平均水平測試中,Go 要比 Python 3 快 25 倍左右,少佔用三分之二的記憶體,但比 Python 大概多寫一倍的程式碼,毫無疑問,開發效率上,Python 是要技高一籌的;
  • 比較 Go 和 Python 在簡單的 web 伺服器方面的效能,單位為傳輸量每秒:
    原生的 Go net/http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架則稍微差點,比 web.py 快 6 至 7 倍。如果是使用Python 中的 tornado 非同步伺服器和框架開發出的Web應用,那麼要比傳統的 web.py 快很多,此時,Go 大概只比它快 1.2 至 1.5 倍,Go 在 Web 開發的領域比 Python 要快,但目前來看,並非碾壓態勢。

07

業務方向

  1. 網路程式設計:

    Go 語言原生支援高效的併發程式設計,因此非常適合用於構建網路應用程式和分散式系統。

  2. 大資料處理:

    Go 語言具有高效的執行效能和併發處理能力,因此很適合用於處理大量資料。

  3. 雲原生開發:

    隨著雲原生應用的興起,Go 語言也成為雲原生開發的熱門選擇。Go 的快速啟動時間、小記憶體佔用和高併發效能使其非常適合在雲環境中構建輕量級容器化應用和無伺服器函式。

  4. 微服務:

    Go 語言對於構建微服務和 API 很有優勢,因為它的程式碼結構簡單,易於維護,同時具有高效和高併發特性

  5. 資料庫和儲存系統:

    Go 語言提供了豐富的資料庫和儲存庫,包括 SQL 資料庫(如 MySQL、PostgreSQL)、NoSQL 資料庫(如 MongoDB、Redis)以及分散式儲存系統(如 etcd)。這使得 Go 成為開發高效能、可擴充套件和可靠的資料儲存解決方案的理想語言。

  6. Web 開發:

    Go 語言擁有輕量級的 HTTP 伺服器,使其成為構建高效能 Web 應用程式的理想選擇。它支援快速開發和部署,並且具有良好的效能和可靠性。很多人使用 Golang 是因為它非常快,而且它可以用來並行執行程序,這樣他們就不必互相等待。

    它內建了對併發的支援,並促進了單個程序中執行緒和處理器之間的並行性。這可以使你的網站更容易快速載入併為你提供最佳的使用者體驗。

  7. 區塊鏈開發:

    Go 語言在區塊鏈開發領域也得到了廣泛應用。許多知名的區塊鏈專案(如 Ethereum)使用 Go 語言作為其主要開發語言,因為 Go 具有高效的併發能力和良好的效能,適合處理區塊鏈交易和智慧合約。

來自 Go 語言之父的忠告

Rob Pike 今年已經 68 歲了,大部分時候在澳大利亞生活,現在居住在悉尼新南威爾士州。

在最近的一次採訪中,他總結了自己 40 多年開發經驗說:避免倦怠的最好方法是在支援你的環境中做你真正喜歡的事情。他認為自己是幸運的,在貝爾實驗室和谷歌都是如此。

同時他也提醒我們:如果對工作感到壓力,應該隨時休息或者改變方向

參考資料推薦

Go 官方文件:https://go.dev/doc/

Go 技術論壇:https://learnku.com/docs/the-way-to-go

Go 語言簡明教程:https://geektutu.com/post/quick-golang.html

Go 語言中文網:https://studygolang.com/

C 語言中文網:https://c.biancheng.net/golang/intro/

維基百科:https://en.wikipedia.org/wiki/Go_(programming_language)

菜鳥教程:https://www.runoob.com/go/go-tutorial.html

下期預告:《【Go 語言入門專欄】Go 安裝與環境配置》

相關文章