go设置后端启动_为什么 Rubyists 应该考虑学习 Go
如今,越來(lái)越少的 Web 開發(fā)人員開始專注于 Ruby 之類的單一語(yǔ)言。我們針對(duì)不同的工作使用不同的工具。在本文中,Ayooluwa Isaiah 認(rèn)為 Go 是 Ruby 的完美補(bǔ)充。兩門語(yǔ)言都會(huì)的開發(fā)人員可以很好地應(yīng)對(duì)幾乎所有后端挑戰(zhàn)。
Ruby 和 Rails 是出色的工具,可讓你快速創(chuàng)建復(fù)雜的 Web 應(yīng)用程序。好吧,一些復(fù)雜的 Web 應(yīng)用程序。盡管它們?cè)趥鹘y(tǒng)的,整體的,服務(wù)器呈現(xiàn)的應(yīng)用程序方面表現(xiàn)出色,但在交付實(shí)時(shí)或分布式服務(wù)方面卻表現(xiàn)不佳。
這就是為什么 Rubyists 會(huì)去學(xué)習(xí) Go 之類的語(yǔ)言的原因。Go 專為編寫可處理大量連接的輕量服務(wù)而設(shè)計(jì)。它的優(yōu)勢(shì)與 Ruby 的劣勢(shì)驚人地吻合。如果你會(huì)這兩門語(yǔ)言,那么你基本上是勢(shì)不可擋的。
本文是關(guān)于從 Rubyist 的角度學(xué)習(xí) Go 的系列文章的第一篇。它將涵蓋與其他任何教程中相同的語(yǔ)言基本原理。但是,將花費(fèi)時(shí)間在 Ruby 中可能的陌生領(lǐng)域。
##Go 簡(jiǎn)介
Go 是由 Robert Griesemer,Rob Pike 和 Ken Thompson 在 Google 設(shè)計(jì)的一種編譯的,靜態(tài)類型的編程語(yǔ)言,它于 Ruby 首次發(fā)布十多年后的 2007 年開始開發(fā),并于 2009 年首次發(fā)布。
開發(fā)新的編程語(yǔ)言的想法源自與 Google 使用其他語(yǔ)言有關(guān)的挫敗感。目標(biāo)是創(chuàng)建一種語(yǔ)言,以解決現(xiàn)代編程難題,同時(shí)消除所有無(wú)關(guān)功能,這些功能使維護(hù)諸如 C++ 之類的代碼變得困難。
Go 極簡(jiǎn)。它的語(yǔ)法很簡(jiǎn)單,只有 25 個(gè)關(guān)鍵字。它的規(guī)范相對(duì)容易閱讀。這意味著你可以快速啟動(dòng)并運(yùn)行。讓我們一起去看看 “hello world” 是什么樣的:
//?Hello?World!?program?in?GoGo 提供類型安全性和快速的開發(fā)周期
作為 Ruby 開發(fā)人員,編寫完代碼,然后立即運(yùn)行它。我們中的許多人從未發(fā)現(xiàn)有什么不同,因此我們沒(méi)有意識(shí)到快速開發(fā)周期是什么奢侈品。
必須編譯的像 C++ 之類的語(yǔ)言。在較大的代碼庫(kù)上,這可能需要幾分鐘甚至幾小時(shí)。您能想象這么長(zhǎng)時(shí)間運(yùn)行剛剛編寫的代碼會(huì)多么令人沮喪嗎?
當(dāng)然,之所以要花費(fèi)這么長(zhǎng)時(shí)間,是因?yàn)?C++ 編譯器在前期做了很多工作,而 Ruby 沒(méi)有。在 C++ 中,如果您拼寫錯(cuò)誤的方法名稱,編譯器會(huì)告訴您。這是因?yàn)?C++ 是“類型安全的”。在 Ruby 中,直到運(yùn)行代碼并獲取常見的 NoMethodError,您才知道自己犯了一個(gè)錯(cuò)誤。
NoMethodError exceptionGo 為你提供了兩全其美的方案:快速的開發(fā)周期和類型安全。
Go 具有動(dòng)態(tài)語(yǔ)言一樣的快速開發(fā)體驗(yàn),這是因?yàn)樗哂虚W電般的快速編譯時(shí)間,同時(shí)還提供了這些動(dòng)態(tài)語(yǔ)言所缺乏的類型安全性。Go 程序也非常快。它們并沒(méi)有完全達(dá)到 Rus t或 C 的水平,但比其他語(yǔ)言(如 Ruby 或 Python)要快得多。
Go 是一種多用途語(yǔ)言,可以在軟件開發(fā)的許多不同領(lǐng)域中使用。它具有內(nèi)置的并發(fā)功能,特別適合網(wǎng)絡(luò)應(yīng)用程序和分布式云服務(wù),使應(yīng)用程序可以有效利用運(yùn)行它的硬件的可用資源。
Go 很簡(jiǎn)單
從 Go 誕生之日起,避免引入太多功能成為 Go 的特定設(shè)計(jì)目標(biāo)。許多其他語(yǔ)言都希望繼續(xù)添加更多功能,其理由通常是為了表達(dá)力。Go 的設(shè)計(jì)師通過(guò)選擇只包含覆蓋解決方案空間并與語(yǔ)言的其他功能可預(yù)測(cè)地交互的功能來(lái)拒絕這種哲學(xué)。
Go 語(yǔ)言的原始設(shè)計(jì)師之一肯·湯普森(Ken Thompson)很好地總結(jié)了這種不同尋常的立場(chǎng):
當(dāng)我們?nèi)齻€(gè)人(Thompson, Rob Pike 和 Robert Griesemer)開始開發(fā) Go 時(shí),純粹是研究。我們?nèi)齻€(gè)在一起,決定這么做,因?yàn)橛憛?C ++。[笑聲] ... [回到Go],我們開始的想法是,我們?nèi)齻€(gè)人都必須與語(yǔ)言的每個(gè)功能進(jìn)行確認(rèn),因此,任何原因,都不會(huì)在語(yǔ)言中添加多余的垃圾。
多年來(lái),Go 團(tuán)隊(duì)一直恪守這一理念。這導(dǎo)致了一種語(yǔ)言的設(shè)計(jì),即使在某些情況下(例如在處理錯(cuò)誤時(shí))過(guò)于冗長(zhǎng),其語(yǔ)言也為清晰起見而設(shè)計(jì)。
//?Error?handling?in?GoGo 程序通常具有很高的可讀性和易于維護(hù)性,因?yàn)槌藰I(yè)務(wù)邏輯之外,您不需要了解太多的事情就可以在任何代碼庫(kù)上工作,即使是不熟悉的代碼庫(kù),也不會(huì)遇到每個(gè)開發(fā)人員都使用的問(wèn)題。語(yǔ)言的不同子集,這是用其他語(yǔ)言編寫的大型軟件項(xiàng)目中經(jīng)常遇到的情況。
Go 很“固執(zhí)”
Go 對(duì)如何編寫和格式化代碼有強(qiáng)烈的規(guī)定。因此,所有 Go 代碼看起來(lái)都差不多。這種質(zhì)量有助于減輕熟悉陌生代碼庫(kù)時(shí)的認(rèn)知負(fù)擔(dān),并消除有關(guān)瑣碎細(xì)節(jié)(例如空格和大括號(hào)位置)的不必要爭(zhēng)論。
該語(yǔ)言內(nèi)置了 gofmt 和 golint 之類的工具,可為現(xiàn)有的所有 Go 代碼提供格式化和編碼,并且它們遵循的規(guī)則無(wú)法以任何方式進(jìn)行配置。例如,gofmt 使用制表符縮進(jìn) Go 程序。您是否喜歡空格而不是制表符?好吧,你不能改變它。至少通過(guò) gofmt 做不到。
Go 不允許你導(dǎo)入包或在不使用包的情況下聲明變量。如果嘗試這樣做,代碼將無(wú)法編譯。這種行為背后的想法是為了短期的不方便而換來(lái)長(zhǎng)期的編譯速度和程序的清晰度。
Go 語(yǔ)言不存在訪問(wèn)修飾符關(guān)鍵字。沒(méi)有 public,private 或 protected 關(guān)鍵字。Go 支持兩種用于變量,函數(shù)和其他類型(即已導(dǎo)出和未導(dǎo)出)的訪問(wèn)修飾符,它們可以在包級(jí)別使用。
如果要?jiǎng)?chuàng)建未導(dǎo)出的標(biāo)識(shí)符(在程序包外部無(wú)法訪問(wèn)的標(biāo)識(shí)符),請(qǐng)以小寫字母開頭。您可能會(huì)猜到,導(dǎo)出的標(biāo)識(shí)符以大寫字母開頭。在閱讀代碼時(shí)會(huì)立即理解這一點(diǎn),并使代碼更加簡(jiǎn)潔。
var?Foo?Go 的測(cè)試包附帶一個(gè)要求,即任何測(cè)試文件都必須帶有 _test.go 后綴。名為 program.go 的文件有測(cè)試文件時(shí),應(yīng)該命名為 program_test.go。這樣一來(lái),Go 可以在編譯代碼時(shí)忽略測(cè)試文件,因?yàn)槌绦蜻\(yùn)行不需要它們。當(dāng)您要測(cè)試代碼時(shí),提供了開箱即用的 go test 命令,該命令執(zhí)行這些文件并運(yùn)行測(cè)試。
Go 的兩極分化
盡管 Go 的擁護(hù)者人數(shù)眾多,但如今批評(píng)這種語(yǔ)言已成為一種時(shí)尚。甚至還有一個(gè) GitHub 代碼庫(kù),專用于列出抱怨 Go 的文章。他們中的大多數(shù)人都專注于 Go 所沒(méi)有的功能或語(yǔ)言中的某些問(wèn)題。
與其他所有語(yǔ)言一樣,Go 也有相當(dāng)多的包袱和缺點(diǎn)。隨著語(yǔ)言的發(fā)展,隨著時(shí)間的流逝,這些事情可能會(huì)有所改善。Go的主要優(yōu)勢(shì)在于其基本的極簡(jiǎn)主義哲學(xué)。但是,它并不完美,某些方面可以改進(jìn),包括缺少泛型。
Go 永遠(yuǎn)不會(huì)使每個(gè)人都高興,但是當(dāng)用于它設(shè)計(jì)的問(wèn)題領(lǐng)域時(shí),它絕對(duì)是贏家!
Go 非常適合 Web 開發(fā)
Go 具有令人驚嘆的標(biāo)準(zhǔn)庫(kù),可讓您快速開發(fā)可擴(kuò)展且安全的 Web 應(yīng)用程序,而無(wú)需使用框架。它帶有一個(gè)功能齊全的 Web 服務(wù)器(net/http),并包括模板,路由以及大多數(shù)您需要的 Rails 之類的東西。對(duì)于許多類型的項(xiàng)目,堅(jiān)持使用標(biāo)準(zhǔn)庫(kù)是完全合理的。
在標(biāo)準(zhǔn)庫(kù)不符合您的期望的情況下,存在一些補(bǔ)充標(biāo)準(zhǔn)庫(kù)的第三方軟件包,例如 Gorilla Toolkit。另外,如果您確實(shí)需要一個(gè)包含所有內(nèi)容的框架,您將很高興得知存在多個(gè)選擇。如果您正在尋找具有與 Rails 類似特征的東西,可以看看Buffalo。
Go 程序的部署過(guò)程也輕而易舉!您不需要在服務(wù)器上安裝任何東西。只需為您的目標(biāo)操作系統(tǒng)編譯項(xiàng)目,您將獲得一個(gè)可移植的二進(jìn)制文件,可以上傳到服務(wù)器并執(zhí)行該二進(jìn)制文件。
例如,要從 Linux 計(jì)算機(jī)為 Windows 環(huán)境構(gòu)建,可以使用以下命令:
GOOS=windows?GOARCH=386?go?build?-o?hello.exe?hello.go生成的 hello.exe 文件將可在具有 x86 CPU 的任何 Windows 計(jì)算機(jī)上運(yùn)行,而無(wú)需任何進(jìn)一步的設(shè)置。這對(duì)容器也很好。只需將一個(gè)二進(jìn)制文件放入一個(gè)輕量級(jí)的 Docker 容器中,設(shè)置一些環(huán)境變量,然后運(yùn)行該應(yīng)用程序即可!
如果在部署后出現(xiàn)問(wèn)題并且需要回滾,則可以輕松地還原到先前的二進(jìn)制文件。由于整個(gè)程序都被編譯為單個(gè)二進(jìn)制文件,因此您無(wú)需擔(dān)心意外升級(jí)了依賴項(xiàng)。
與 Rails 相比,Go 程序通常在 CPU 和內(nèi)存資源上使用的資源要少得多,這有助于顯著降低服務(wù)器成本。例如,Iron 在從 Rails 切換到 Go 時(shí),在啟動(dòng)時(shí)就可以將其內(nèi)存使用量從 50MB 減少到數(shù)百 KB。
由于其內(nèi)置的并發(fā)功能,Go 非常適合需要同時(shí)處理數(shù)千個(gè)請(qǐng)求的大型軟件項(xiàng)目。Go 在執(zhí)行其他任務(wù)時(shí)會(huì)使用 goroutines 并發(fā)執(zhí)行一些代碼,而稱為“channel”的輕量級(jí)通信機(jī)制可幫助您避免并發(fā)數(shù)據(jù)修改。
Go 入門
如果你準(zhǔn)備學(xué)習(xí) Go,則可以按照此處提供的說(shuō)明將其下載并安裝到計(jì)算機(jī)上。要學(xué)習(xí)該語(yǔ)言的基本語(yǔ)法和功能,請(qǐng)使用 A Tour of Go。gobyexample 是另一個(gè)值得學(xué)習(xí)的好資源。
想要利用您所學(xué)的知識(shí)來(lái)構(gòu)建程序嗎?試試 https://gophercises.com/。它提供免費(fèi)的教程,通過(guò)構(gòu)建多個(gè)項(xiàng)目來(lái)涵蓋語(yǔ)言的各個(gè)方面,每個(gè)項(xiàng)目旨在教給您一些不同的東西。
如果您想讀一本書,那么《Go編程語(yǔ)言》和《Go語(yǔ)言實(shí)戰(zhàn) Go In Action》是極好的讀物。
總結(jié)
使用 Go 還是 Ruby 將取決于您的項(xiàng)目要求。兩者都是很棒的,它們絕對(duì)可以共存于您的語(yǔ)言工具箱中。
作為 Ruby 開發(fā)人員學(xué)習(xí) Go,軟件開發(fā)中的其他范例會(huì)讓你眼前一亮。有時(shí)會(huì)感到陌生,但最終會(huì)給您帶來(lái)不同的看法并幫助您成為更好的開發(fā)人員。
我希望本文有助于激起您對(duì) Go 的好奇心,并促使您考慮如何在當(dāng)前和將來(lái)的軟件項(xiàng)目中使用它。
原文鏈接:https://www.honeybadger.io/blog/rubyist-learn-go/
作者:Ayooluwa Isaiah
翻譯:Go語(yǔ)言中文網(wǎng) polaris
推薦閱讀
Go 和 Rust 的優(yōu)缺點(diǎn);預(yù)測(cè) Go 1.16-1.19 會(huì)支持泛型
喜歡本文的朋友,歡迎關(guān)注“Go語(yǔ)言中文網(wǎng)”:
Go語(yǔ)言中文網(wǎng)啟用微信學(xué)習(xí)交流群,歡迎加微信:274768166,投稿亦歡迎
總結(jié)
以上是生活随笔為你收集整理的go设置后端启动_为什么 Rubyists 应该考虑学习 Go的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jsp人事管理系统_Jsp+Ssm+My
- 下一篇: 中希尔排序例题代码_【数据结构与算法】这