Go程式語言的真正優點是什麼?
在其十多年的發展歷程中, Google 的Go 語言 (又名 Golang )已經從極客的好奇心發展成為一些重要雲中心專案背後 久經考驗的程式語言。
為什麼 Docker 和 Kubernetes 等專案的開發者會選擇 Go作為開發語言 ?Go 的特徵優勢是什麼,它與其他程式語言有什麼不同,最適合構建什麼樣的專案?在本文中,我們將探討 Go 的功能集、最佳用例、語言的遺漏和限制,以及 Go 的發展方向。
Go 語言小而簡單
Go,或者通常所說的 Golang,是由谷歌員工開發的——主要是長期的 Unix 大師和谷歌傑出工程師 Rob Pike——但嚴格來說,它並不是一個“谷歌專案”。相反,Go 是作為一個社群主導的開源專案開發的,由領導層帶頭,他們對 Go 的使用方式和語言的發展方向有強烈的看法。
Go 意味著易於學習、易於使用並且易於其他開發人員閱讀。Go 沒有大量的功能集,尤其是與 C++ 等語言相比。Go 的語法讓人想起 C,這使得長期 C 開發人員學習起來相對容易。也就是說,Go 的許多特性,尤其是它的併發和函數語言程式設計特性,都可以追溯到 Erlang 等語言。
作為一種用於構建和維護各種跨平臺企業應用程式的類 C 語言, Go 與 Java 有很多共同之處 。作為一種能夠快速開發可能在任何地方執行的程式碼的方法,您可以在 Go 和 Python 之間進行比較,儘管差異遠大於相似之處。
Go 語言適合每個人
Go 文件將 Go 描述為“一種快速、靜態型別的編譯語言,感覺就像是一種動態型別的解釋語言。” 即使是大型 Go 程式也將在幾秒鐘內編譯。此外,Go 避免了 C 樣式包含檔案和庫的大部分開銷。
Go 以多種方式使開發人員的生活變得輕鬆。
Go很方便
在滿足許多常見程式設計需求的能力方面,Go 與 Python 等指令碼語言進行了比較。其中一些功能內建在語言本身中,例如用於併發和執行緒類行為的“goroutines”,而 Go 標準庫包中提供了其他功能,例如 Go 的 http 包 。與 Python 一樣,Go 提供了自動記憶體管理功能,包括垃圾收集。
與 Python 等指令碼語言不同,Go 程式碼編譯為快速執行的本機二進位制檔案。與 C 或 C++ 不同的是,Go 的編譯速度非常快——足以讓使用 Go 感覺更像是使用指令碼語言而不是編譯語言。此外,Go 構建系統沒有其他編譯語言那麼複雜。構建和執行 Go 專案只需要幾個步驟和很少的簿記。
Go執行很快
Go 二進位制檔案的執行速度比 C 對應的要慢,但對於大多數應用程式來說,速度上的差異可以忽略不計。對於絕大多數工作而言,Go 的效能與 C 一樣好,並且通常比其他以開發速度著稱的語言(例如 JavaScript、Python 和 Ruby)快得多。
Go 是行動式的
使用 Go 工具鏈建立的可執行檔案可以獨立存在,沒有預設的外部依賴項。Go 工具鏈可用於各種作業系統和硬體平臺,並可用於跨平臺編譯二進位制檔案。
Go 是可互操作的
Go 在不犧牲對底層系統的訪問的情況下提供了上述所有功能。Go 程式可以與外部 C 庫對話或進行本地系統呼叫。例如,在 Docker 中,Go 與低階 Linux 函式、cgroup 和名稱空間介面,以發揮容器的魔力。
Go 得到廣泛支援
Go 工具鏈可作為 Linux、MacOS 或 Windows 二進位制檔案或 Docker 容器免費提供。Go 預設包含在許多流行的 Linux 發行版中,例如 Red Hat Enterprise Linux 和 Fedora,這使得將 Go 原始碼部署到這些平臺變得更加容易。從 Microsoft Visual Studio Code 到 ActiveState 的 Komodo IDE,許多第三方開發環境對 Go 的支援也很強大。
Go 語言在哪裡工作得最好
沒有一種語言適合所有工作,但有些語言比其他語言適合更多的工作。
Go 最適合開發以下應用程式型別。
雲原生開發
Go 的併發和網路特性以及高度的可移植性使其非常適合構建雲原生應用程式。事實上,Go 曾被用於構建雲原生計算的多個基石,包括 Docker 、 Kubernetes 和 Istio 。
分散式網路服務
網路應用程式的生死取決於併發,而 Go 的原生併發特性——主要是 goroutine 和 通道 ——非常適合這種工作。因此,許多 Go 專案用於網路、分散式功能和雲服務: API 、 Web 伺服器 、 Web 應用程式的最小框架 等。
實用程式和獨立工具
Go 程式編譯成具有最少外部依賴的二進位制檔案。這使得它們非常適合建立實用程式和其他工具,因為它們可以快速啟動並且可以很容易地打包以便重新分發。一個示例是 稱為 Teleport 的訪問伺服器(用於 SSH 等) 。Teleport 可以通過從原始碼編譯或下載預構建的二進位制檔案快速輕鬆地部署在伺服器上。
Go 語言限制
Go 的自以為是的功能集既受到讚揚也受到批評。Go 的設計傾向於小而易於理解,故意省略了某些功能。結果是某些在其他語言中很常見的功能在 Go 中根本不可用——這是故意的。
一個長期存在的抱怨是缺乏通用函式,它允許函式接受許多不同型別的變數。多年來,Go 的開發團隊一直反對在語言中新增泛型,理由是他們想要一種語法和一組行為來補充 Go 的其餘部分。但從 2022 年初發布的 Go 1.18 開始,該語言 現在包含泛型語法 。要吸取的教訓是,Go 很少新增主要功能,而且只有經過深思熟慮,才能更好地保持跨版本的廣泛相容性。
Go 的另一個潛在缺點是生成的二進位制檔案的大小。Go 二進位制檔案預設是靜態編譯的,這意味著執行時所需的一切都包含在二進位制映像中。這種方法簡化了構建和部署過程,但代價是簡單的“你好,世界!” 在 64 位 Windows 上重約 1.5MB。Go 團隊一直在 努力在 每個後續版本 中減小這些二進位制檔案的大小。 也可以 通過壓縮 或 刪除 Go 的除錯資訊 來縮小 Go 二進位制檔案。最後一個選項對於獨立的分散式應用程式可能比對於雲或網路服務更有效,如果服務出現故障,則擁有除錯資訊很有用。
Go 的另一個被吹捧的特性,自動記憶體管理,可以被視為一個缺點,因為垃圾收集需要一定量的處理開銷。按照設計,Go 不提供手動記憶體管理 ,Go 中的垃圾收集因無法很好地處理企業應用程式中出現的各種記憶體負載而受到批評。
也就是說,每個新版本的 Go 似乎都改進了記憶體管理功能。例如,Go 1.8 顯著縮短了垃圾收集的延遲時間 。Go 開發人員確實有能力在 C 擴充套件中使用手動記憶體分配,或者通過 第三方手動記憶體管理庫 ,但大多數 Go 開發人員更喜歡本地解決方案來解決這些問題。
圍繞為 Go 應用程式(例如桌面應用程式中的那些)構建豐富的 GUI 的軟體文化仍然是分散的。
大多數 Go 應用程式都是命令列工具或網路服務。也就是說,各種專案正在努力為 Go 應用程式帶來豐富的 GUI。 GTK 和 GTK3 框架有繫結 。另一個專案旨在提供 平臺原生 UI ,儘管這些依賴於 C 繫結並且不是用純 Go 編寫的。而Windows使用者可以試試 walk 。但是在這個領域還沒有出現明確的贏家或安全的長期賭注,一些專案,比如谷歌試圖建立一個 跨平臺的 GUI 庫 ,已經被擱置了。此外,由於 Go 在設計上是獨立於平臺的,因此這些都不太可能成為標準包集的一部分。
儘管 Go 可以與本機系統函式通訊,但它並不是為建立低階系統元件而設計的,例如核心或裝置驅動程式或嵌入式系統。畢竟,Go 應用程式的 Go 執行時和垃圾收集器依賴於底層作業系統。(對此類工作的尖端語言感興趣的開發人員可能會研究 Rust 語言 。)
Go語言的侷限
Go 的未來發展將更多地轉向其開發者群體的需求,Go 的思想者會改變語言以更好地適應這些受眾,而不是通過頑固的榜樣來引領。一個典型的例子是泛型,在對最好的方法進行了深思熟慮之後,最終將其新增到語言中。
2021 年 Go 開發者調查 發現 ,Go 使用者總體上對該語言提供的功能感到滿意,但也提到了很大的改進空間。Go 使用者希望改進的主要領域是依賴管理(Go 中的一個持續挑戰)、診斷錯誤和可靠性,而記憶體、CPU 使用率、二進位制大小和構建時間等問題的排名要低得多。
大多數語言都傾向於一組核心用例。在圍棋出現的十年裡,它的利基市場已經變成了網路服務,它可能會繼續擴大其佔有率。總的來說,該語言引用的主要用例是建立 API 或 RPC 服務 (49%),其次是資料處理 (10%)、Web 服務 (10%) 和 CLI 應用程式 (8%)。
Go 語言越來越受歡迎的另一個標誌是有多少開發人員在評估後選擇了它。在考慮使用 Go 進行專案的受訪者中,75% 的人選擇了該語言。在沒有選擇 Go 的人中,Rust (25%)、Python (17%) 和 Java (12%) 是首選。這些語言中的每一種都已經或正在尋找其他利基:Rust 用於 安全和快速的系統程式設計 ; 用於原型設計、自動化和粘合程式碼 的 Python ; 和用於長期企業應用程式的 Java 。
Go 的速度和開發簡單性將在多大程度上將其帶入其他用例,或者 Go 將在多大程度上滲透到企業開發中,還有待觀察。但是 Go 作為主要程式語言的未來已經得到保證——當然在雲中,Go 的速度和簡單性簡化了可長期維護的可擴充套件基礎設施的開發。
原文標題: What’s the Go programming language really good for?
- Spring中實現非同步呼叫的方式有哪些?
- 帶引數的全型別 Python 裝飾器
- 整理了幾個Python正則表示式,拿走就能用!
- SOLID:開閉原則Go程式碼實戰
- React中如何引入CSS呢
- 一個新視角:前端框架們都卷錯方向了?
- 編碼中的Adapter,不僅是一種設計模式,更是一種架構理念與解決方案
- 手寫程式語言-遞迴函式是如何實現的?
- 一文搞懂模糊匹配:定義、過程與技術
- 新來個阿里 P7,僅花 2 小時,做出一個多執行緒永動任務,看完直接跪了
- Puzzlescript,一種開發H5益智遊戲的引擎
- @Autowired和@Resource到底什麼區別,你明白了嗎?
- CSS transition 小技巧!如何保留 hover 的狀態?
- React如此受歡迎離不開這4個主要原則
- LeCun再炮轟Marcus: 他是心理學家,不是搞AI的
- Java保證執行緒安全的方式有哪些?
- 19個殺手級 JavaScript 單行程式碼,讓你看起來像專業人士
- Python 的"self"引數是什麼?
- 別整一坨 CSS 程式碼了,試試這幾個實用函式
- 再有人問你什麼是MVCC,就把這篇文章發給他!