你沒據說過的Go語言驚人優勢

鏈客,專爲開發者而生,有問必答!編程

此文章來自區塊鏈技術社區,未經容許拒絕轉載。json

圖片描述

你沒據說過的Go語言驚人優勢
做者:Kirill Rogovoy 2018-09-29 來源:51CTO
【新品產上線啦】51CTO播客,隨時隨地,碎片化學習安全

在這篇文章中,我將討論爲何你須要嘗試一下 Go 語言,以及應該從哪裏學起。服務器

Go 語言是多是最近幾年裏你常常聽人提及的編程語言。儘管它在 2009 年已經發布了,但它最近纔開始流行起來。網絡

根據 Google 趨勢,Go 語言很是流行。併發

這篇文章不會討論一些你常常看到的 Go 語言的主要特性。框架

相反,我想向您介紹一些至關小衆但仍然很重要的功能。只有在您決定嘗試 Go 語言後,您纔會知道這些功能。編程語言

這些都是表面上沒有體現出來的驚人特性,但它們能夠爲您節省數週或數月的工做量。並且這些特性還可使軟件開發更加愉快。函數式編程

閱讀本文不須要任何語言經驗,因此沒必要擔憂你還不瞭解 Go 語言。若是你想了解更多,能夠看看我在底部列出的一些額外的連接。函數

咱們將討論如下主題:

GoDoc
靜態代碼分析
內置的測試和分析框架
競爭條件檢測
學習曲線
反射
Opinionatedness
文化
請注意,這個列表不遵循任何特定順序來討論。

GoDoc
Go 語言很是重視代碼中的文檔,因此也很簡潔。

GoDoc 是一個靜態代碼分析工具,能夠直接從代碼中建立漂亮的文檔頁面。GoDoc 的一個顯著特色是它不使用任何其餘的語言,如 JavaDoc、PHPDoc 或 JSDoc 來註釋代碼中的結構,只須要用英語。

它使用從代碼中獲取的儘量多的信息來概述、構造和格式化文檔。它有多而全的功能,好比:交叉引用、代碼示例,並直接連接到你的版本控制系統倉庫。

而你須要作的只有添加一些像 // MyFunc transforms Foo into Bar 這樣子的老牌註釋,而這些註釋也會反映在的文檔中。你甚至能夠添加一些經過網絡界面或者在本地能夠實際運行的 代碼示例。

GoDoc 是 Go 的惟一文檔引擎,整個社區都在使用。這意味着用 Go 編寫的每一個庫或應用程序都具備相同的文檔格式。從長遠來看,它能夠幫你在瀏覽這些文檔時節省大量時間。

例如,這是我最近一個小項目的 GoDoc 頁面:pullkee — GoDoc。

靜態代碼分析
Go 嚴重依賴於靜態代碼分析。例如用於文檔的 godoc,用於代碼格式化的 gofmt,用於代碼風格的 golint,等等。

它們是如此之多,甚至有一個總攬了它們的項目 gometalinter ,將它們組合成了單一的實用程序。

這些工具一般做爲獨立的命令行應用程序實現,並可輕鬆與任何編碼環境集成。

靜態代碼分析實際上並非現代編程的新概念,可是 Go 將其帶入了絕對的範疇。我沒法估量它爲我節省了多少時間。此外,它給你一種安全感,就像有人在你背後支持你同樣。

建立本身的分析器很是簡單,由於 Go 有專門的內置包來解析和加工 Go 源碼。

你能夠從這個連接中瞭解到更多相關內容: GothamGo Kickoff Meetup: Alan Donovan 的 Go 靜態分析工具。

內置的測試和分析框架
您是否曾嘗試爲一個從頭開始的 JavaScript 項目選擇測試框架?若是是這樣,你或許會理解經歷這種過分分析analysis paralysis的痛苦。您可能也意識到您沒有使用其中 80% 的框架。

一旦您須要進行一些可靠的分析,問題就會重複出現。

Go 附帶內置測試工具,旨在簡化和提升效率。它爲您提供了最簡單的 API,並作出最小的假設。您能夠將它用於不一樣類型的測試、分析,甚至能夠提供可執行代碼示例。

它能夠開箱即用地生成便於持續集成的輸出,並且它的用法很簡單,只需運行 go test。固然,它還支持高級功能,如並行運行測試,跳過標記代碼,以及其餘更多功能。

競爭條件檢測
您可能已經據說了 Goroutine,它們在 Go 中用於實現併發代碼執行。若是你不曾瞭解過,這裏有一個很是簡短的解釋。

不管具體技術如何,複雜應用中的併發編程都不容易,部分緣由在於競爭條件的可能性。

簡單地說,當幾個併發操做以不可預測的順序完成時,競爭條件就會發生。它可能會致使大量的錯誤,特別難以追查。若是你曾經花了一天時間調試集成測試,該測試僅在大約 80% 的執行中起做用?這多是競爭條件引發的。

總而言之,在 Go 中很是重視併發編程,幸運的是,咱們有一個強大的工具來捕捉這些競爭條件。它徹底集成到 Go 的工具鏈中。

您能夠在這裏閱讀更多相關信息並瞭解如何使用它:介紹 Go 中的競爭條件檢測 - Go Blog。

學習曲線
您能夠在一個晚上學習全部的 Go 語言功能。我是認真的。固然,還有標準庫,以及不一樣的,更具體領域的最佳實踐。可是兩個小時就足以讓你自信地編寫一個簡單的 HTTP 服務器或命令行應用程序。

Go 語言擁有出色的文檔,大部分高級主題已經在他們的博客上進行了介紹:Go 編程語言博客。

比起 Java(以及 Java 家族的語言)、Javascript、Ruby、Python 甚至 PHP,你能夠更輕鬆地把 Go 語言帶到你的團隊中。因爲環境易於設置,您的團隊在完成第一個生產代碼以前須要進行的投資要小得多。

反射
代碼反射本質上是一種隱藏在編譯器下並訪問有關語言結構的各類元信息的能力,例如變量或函數。

鑑於 Go 是一種靜態類型語言,當涉及更鬆散類型的抽象編程時,它會受到許多各類限制。特別是與 Javascript 或 Python 等語言相比。

此外,Go 沒有實現一個名爲泛型的概念,這使得以抽象方式處理多種類型更具挑戰性。然而,因爲泛型帶來的複雜程度,許多人認爲不實現泛型對語言其實是有益的。我徹底贊成。

根據 Go 的理念(這是一個單獨的主題),您應該努力不要過分設計您的解決方案。這也適用於動態類型編程。儘量堅持使用靜態類型,並在確切知道要處理的類型時使用接口interface。接口在 Go 中很是強大且無處不在。

可是,仍然存在一些狀況,你沒法知道你處理的數據類型。一個很好的例子是 JSON。您能夠在應用程序中來回轉換全部類型的數據。字符串、緩衝區、各類數字、嵌套結構等。

爲了解決這個問題,您須要一個工具來檢查運行時的數據並根據其類型和結構採起不一樣行爲。反射Reflect能夠幫到你。Go 擁有一流的反射包,使您的代碼可以像 Javascript 這樣的語言同樣動態。

一個重要的警告是知道你使用它所帶來的代價 —— 而且只有知道在沒有更簡單的方法時才使用它。

你能夠在這裏閱讀更多相關信息: 反射的法則 — Go 博客.

您還能夠在此處閱讀 JSON 包源碼中的一些實際代碼: src/encoding/json/encode.go — Source Code

Opinionatedness(專制獨裁的 Go)
順便問一下,有這樣一個單詞嗎?

來自 Javascript 世界,我面臨的最艱鉅的困難之一是決定我須要使用哪些約定和工具。我應該如何設計代碼?我應該使用什麼測試庫?我該怎麼設計結構?我應該依賴哪些編程範例和方法?

這有時候基本上讓我卡住了。我須要花時間思考這些事情而不是編寫代碼並知足用戶。

首先,我應該注意到我徹底知道這些慣例的來源,它老是來源於你或者你的團隊。不管如何,即便是一羣經驗豐富的 Javascript 開發人員也很容易發現他們在實現相同的結果時,而大部分的經驗倒是在徹底不一樣的工具和範例上。

這致使整個團隊中出現過分分析,而且使得個體之間更難以相互協做。

嗯,Go 是不一樣的。即便您對如何構建和維護代碼有不少強烈的意見,例如:如何命名,要遵循哪些結構模式,如何更好地實現併發。但你只有一個每一個人都遵循的風格指南。你只有一個內置在基本工具鏈中的測試框架。

雖然這彷佛過於嚴格,但它爲您和您的團隊節省了大量時間。當你寫代碼時,受一點限制其實是一件好事。在構建新代碼時,它爲您提供了一種更直接的方法,而且能夠更容易地調試現有代碼。

所以,大多數 Go 項目在代碼方面看起來很是類似。

文化
人們說,每當你學習一門新的口語時,你也會沉浸在說這種語言的人的某些文化中。所以,您學習的語言越多,您可能會有更多的變化。

編程語言也是如此。不管您未來如何應用新的編程語言,它總能給你帶來新的編程視角或某些特別的技術。

不管是函數式編程,模式匹配pattern matching仍是原型繼承prototypal inheritance。一旦你學會了它們,你就能夠隨身攜帶這些編程思想,這擴展了你做爲軟件開發人員所擁有的問題解決工具集。它們也改變了你閱讀高質量代碼的方式。

而 Go 在這方面有一項了不得的財富。Go 文化的主要支柱是保持簡單,腳踏實地的代碼,而不會產生許多冗餘的抽象概念,並將可維護性放在首位。大部分時間花費在代碼的編寫工做上,而不是在修補工具和環境或者選擇不一樣的實現方式上,這也是 Go 文化的一部分。

Go 文化也能夠總結爲:「應當只用一種方法去作一件事」。

一點注意事項。當你須要構建相對複雜的抽象代碼時,Go 一般會妨礙你。好吧,我會說這是簡單的權衡。

若是你真的須要編寫大量具備複雜關係的抽象代碼,那麼最好使用 Java 或 Python 等語言。然而,這種狀況卻不多。

在工做時始終使用最好的工具!

總結
你或許以前據說過 Go,或者它暫時在你圈子之外的地方。但不管怎樣,在開始新項目或改進現有項目時,Go 多是您或您團隊的一個很是不錯的選擇。

這不是 Go 的全部驚人的優勢的完整列表,只是一些被人低估的特性。

請嘗試一下從 Go 之旅 來開始學習 Go,這將是一個使人驚歎的開始。

相關文章
相關標籤/搜索