標(biāo)簽: Go語(yǔ)言 2025-09-17 次
為了幫助彌合不同開(kāi)發(fā)語(yǔ)言的信息差距,我們與軟件開(kāi)發(fā)項(xiàng)目經(jīng)理坐下來(lái),問(wèn)了他一些有關(guān)Go 開(kāi)發(fā)語(yǔ)言或 GoLang 的問(wèn)題。我們將從開(kāi)發(fā)和應(yīng)用程序性能的角度解釋它的用途、為什么有用以及與Go相關(guān)的一些好處。
使用Go的高級(jí)優(yōu)點(diǎn)
學(xué)習(xí)起來(lái)很簡(jiǎn)單。實(shí)際上,任何具有 Java、C 或 C++ 等其他語(yǔ)言開(kāi)發(fā)背景的程序員都可以輕松學(xué)習(xí)它。
定義Go語(yǔ)言的語(yǔ)法或規(guī)則簡(jiǎn)潔明了,當(dāng)出現(xiàn)問(wèn)題時(shí)更容易理解。
Go也非??焖偾逸p量級(jí)。
與 Java 等語(yǔ)言相比,Go 快了多少?
Go 和 Java 的速度比較
Go直接編譯成主機(jī)的本機(jī)二進(jìn)制文件。它不像Java那樣編譯成字節(jié)碼。使用 Java,您需要在服務(wù)器上安裝虛擬機(jī)來(lái)運(yùn)行字節(jié)碼,這使其成為一個(gè)兩步過(guò)程。
一個(gè)速度示例是計(jì)算數(shù)字的階乘時(shí)。例如,如果您編寫(xiě)Go 和 Java 程序來(lái)計(jì)算 10,000 個(gè)數(shù)字的階乘,Go 程序?qū)⒃?大約0.03 秒內(nèi)完成該過(guò)程,而 Java 程序?qū)⒃诖蠹s0.14 秒內(nèi)完成。
因此,您可以在這里看到差異,即使數(shù)量增加,Go 也會(huì)用 Java 所需時(shí)間的一小部分來(lái)完成計(jì)算。程序越大,您就越能看到差異。
知名公司使用 Go
Uber Netflix、YouTube 和 SoundCloud 等公司都使用Go。有許多著名的公司都在使用Go。我們所看到的主要情況是,每當(dāng)一家公司托管和提供媒體(例如Netflix、YouTube 或 SoundCloud)時(shí),您都會(huì)發(fā)現(xiàn) Go。 許多按需服務(wù)(例如 Uber)也已經(jīng)在使用它。對(duì)于任何想要?jiǎng)?chuàng)建模仿這些科技巨頭的應(yīng)用程序的人來(lái)說(shuō),都是如此。例如,如果有人來(lái)找我們想要?jiǎng)?chuàng)建像 Uber 這樣的東西,我們就會(huì)用原生語(yǔ)言開(kāi)發(fā)前端,比如 iOS 的 Swift和 Android 的 Kotlin。當(dāng)涉及到訪問(wèn)后端服務(wù)器時(shí),Go 是一個(gè)很好的選擇,因?yàn)樗牟l(fā)性可以并行處理數(shù)千個(gè)請(qǐng)求。 稍后我們將詳細(xì)討論并發(fā)。
Go 的多種用途
網(wǎng)絡(luò)組裝
Go 可以與 WebAssembly 一起使用
Go 可用于使用 WebA ssembly進(jìn)行 Web 開(kāi)發(fā)。 它并不是JavaScript 的替代品,因?yàn)?JavaScript 仍然是統(tǒng)治平臺(tái),但 WebAssembly 與之一起工作。因此,如果您有一些需要更高性能的代碼,您可以在 Web Assembly 中編寫(xiě)一小段代碼并將其與 JavaScript 一起使用。
知道了這一點(diǎn),我們現(xiàn)在可以將 Go 代碼編譯成 Web 程序集二進(jìn)制文件。你可以繼續(xù)用Go編寫(xiě),收集或編譯成Web程序集,然后你可以在瀏覽器中使用它。
地鼠JS
GopherJS 將 Go 編譯為純 JavaScript 代碼
Gopher JS 是一個(gè)轉(zhuǎn)譯器。轉(zhuǎn)譯器是將一種語(yǔ)言編譯成另一種語(yǔ)言的東西。它將用一種語(yǔ)言編寫(xiě)的當(dāng)前代碼編譯為機(jī)器代碼二進(jìn)制或字節(jié)碼,就像 Java 的情況一樣。GopherJS用 Go 編寫(xiě),并將 Go 代碼轉(zhuǎn)換為 JavaScript,以便您可以繼續(xù)處理您的項(xiàng)目。它支持 Go 的所有語(yǔ)法和每個(gè)功能。這是除了將 Go 編譯成 Web 程序集之外在瀏覽器中使用 Go 的另一種方式。
與其他編程語(yǔ)言的接口
Go 與不同類型的編程語(yǔ)言交互,是一種通用或通用目的語(yǔ)言。無(wú)論應(yīng)用程序是為 iOS、Android 還是跨平臺(tái)編寫(xiě)的,您都可以使用 Go 來(lái)建立應(yīng)用程序前后端之間的鏈接。
假設(shè)您已經(jīng)有一個(gè)針對(duì) iOS 的系統(tǒng),后端使用 Node JS 構(gòu)建,前端使用Swift構(gòu)建。在這種情況下,可以使用一小段代碼來(lái)獲得更高的性能,以并行處理更多請(qǐng)求,并且可以用 Go 編寫(xiě)這一小段代碼。
然后,您可以使用消息隊(duì)列在代碼的NodeJS部分和代碼的 Go 部分之間進(jìn)行交互。這本質(zhì)上是兩個(gè)進(jìn)程可以通信的管道。
我總是喜歡深入研究新技術(shù),Go 就是其中之一。當(dāng)我第一次看到 Go 時(shí),我說(shuō)哇,這太棒了!它擁有程序員所需的一切。它具有內(nèi)置的并發(fā)性,語(yǔ)法非常簡(jiǎn)潔,并且所有垃圾收集都會(huì)為您處理。用 C 和 C++ 能做到的事情,用 Go 也能做到。
物聯(lián)網(wǎng)和機(jī)器人技術(shù)
Go代碼可以在Raspberry Pi上運(yùn)行。 為了在 Raspberry Pi 上運(yùn)行,有一個(gè)名為T(mén)inyGo的 Go 編譯器。您可以使用它來(lái)編譯代碼并使二進(jìn)制文件也可以在 Arduino 微控制器上運(yùn)行。所以和 Go一樣, TinyGo也得到了 Google 的支持和支持。它仍處于起步階段,但您可以 使用 Go 編寫(xiě)代碼,然后使用TinyGo將其編譯成可以在微控制器上運(yùn)行的二進(jìn)制文件。
微服務(wù)
使用微服務(wù)加速移動(dòng)應(yīng)用程序
使用 Go 的另一種方式是微服務(wù),以幫助加快移動(dòng)應(yīng)用程序的速度。這就是我們軟件開(kāi)發(fā)外包公司主要使用該語(yǔ)言的方式。
您可以將大型系統(tǒng)分解為不同的任務(wù),我們將其稱為A 、B和C 。為了解決這些任務(wù),我們用Go編寫(xiě)微服務(wù)。
然后,我們有一個(gè)消息隊(duì)列,用于在每個(gè)微服務(wù)之間進(jìn)行通信。這樣做的好處在于 它可以并行處理請(qǐng)求。如果任務(wù) A 得到高度備份并出現(xiàn)問(wèn)題,則意味著用戶正在訪問(wèn) 移動(dòng)應(yīng)用程序中的特定功能,該功能需要任務(wù) A 進(jìn)行更多工作。
因此,您要做的就是通過(guò)在任務(wù) A 前面放置一個(gè)負(fù)載均衡器來(lái)擴(kuò)展它。這意味著您不必?cái)U(kuò)展任務(wù) B 或 C,因此您可以節(jié)省處理能力方面的資源,并且不會(huì)讓其他服務(wù)陷入困境。因此,根據(jù)哪些功能在應(yīng)用程序中獲得更多流量,您可以精確地?cái)U(kuò)展該微服務(wù),這就是微服務(wù)架構(gòu)的美妙之處。
如果我們用外行的話來(lái)說(shuō),你可以想象雜貨店的收銀臺(tái)。感恩節(jié)前的周末有 4 條車(chē)道開(kāi)放。如果第 1 通道的員工被拿著數(shù)百件商品的購(gòu)物者猛烈撞擊,您可以將該人換成可能更有經(jīng)驗(yàn)的人。經(jīng)驗(yàn)豐富的員工。這代表負(fù)載平衡器。在此示例中,所有通道都具有相同的功能或工作,但它描繪了多個(gè)服務(wù)同時(shí)運(yùn)行的情況。
Go如何處理并發(fā)
與 Golang Goroutines 的并發(fā)
因?yàn)槿魏问虑槎伎梢杂秘垇?lái)解釋。
并發(fā)意味著您并行運(yùn)行任務(wù)。這意味著您正在對(duì)功能進(jìn)行時(shí)間切片,讓處理器有一些時(shí)間來(lái)處理功能一,然后跳轉(zhuǎn)到功能二,然后跳轉(zhuǎn)到功能三。所以,最后,看起來(lái)一切都是并行運(yùn)行的。
Go 對(duì)于編寫(xiě)并發(fā)程序特別有用。 Java 和 Go 以及其他語(yǔ)言(如 C 或 C++)之間的區(qū)別在于您何時(shí)想要編寫(xiě)并發(fā)函數(shù)。
Go 有一個(gè)獨(dú)特的功能,它是在稱為 Go 例程的語(yǔ)言中構(gòu)建的。它的美妙之處在于 Go 例程是如此輕量級(jí),您可以在一個(gè)簡(jiǎn)單的中等內(nèi)存服務(wù)器上運(yùn)行數(shù)百萬(wàn)個(gè) Go 例程并完成工作。
就速度而言,與 Java 使用的線程相比,Go 例程是輕量級(jí)的。還值得注意的是,用 Java、C 或 C++ 編寫(xiě)代碼使其并發(fā)更加困難。
實(shí)際上,您希望 Web 服務(wù)器能夠并行處理成百上千個(gè)請(qǐng)求。 Go 是專門(mén)為此構(gòu)建的,并且具有巨大的可擴(kuò)展性。
垃圾收集
使用 Golang 垃圾收集進(jìn)行內(nèi)存管理
Go 提供了一種稱為垃圾收集的機(jī)制。它的作用是啟動(dòng)一個(gè)小例程,與您的代碼一起運(yùn)行并不斷檢查未使用的內(nèi)存。運(yùn)行此例程時(shí),它將不斷詢問(wèn),直到可以刪除后臺(tái)進(jìn)程。
在 C 或 C++ 中,您需要手動(dòng)清除該內(nèi)存或堆。如果不這樣做,就會(huì)浪費(fèi)內(nèi)存容量,最終導(dǎo)致程序因內(nèi)存不足而崩潰。
話雖如此,您不想過(guò)于頻繁地運(yùn)行垃圾收集,因?yàn)槟某绦驎?huì)變得很慢。值得慶幸的是,G o 內(nèi)置了一個(gè)優(yōu)秀的增強(qiáng)型垃圾收集器。
舉個(gè)例子,就像你在一艘裝滿水的船上。你抓起一個(gè)桶來(lái)鏟掉多余的東西。垃圾收集者基本上是把水舀出來(lái)以確保你能維持生計(jì)。
隨著Go 版本的最新改進(jìn),垃圾收集繼續(xù)得到進(jìn)一步改進(jìn)。
為什么軟件開(kāi)發(fā)外包公司開(kāi)始使用 Go?
那么,為什么我們軟件開(kāi)發(fā)外包公司開(kāi)始使用 Go 呢?嗯,我們正在尋找可以隨著項(xiàng)目規(guī)模的擴(kuò)大而擴(kuò)展的東西。當(dāng)時(shí),我們只關(guān)注 .NET 和 NodeJS,我們需要開(kāi)發(fā)人員可以快速學(xué)習(xí)的東西。
我們主要使用 Go 進(jìn)行 Web 服務(wù)器開(kāi)發(fā);用于使用 REST API 和任何后臺(tái)服務(wù)。例如,如果有人請(qǐng)求處理圖像,請(qǐng)求就會(huì)進(jìn)來(lái),然后我們運(yùn)行一個(gè)運(yùn)行 Go 的后臺(tái)服務(wù)。
需要 Go 的早期程序之一是面向消費(fèi)者的應(yīng)用程序,因?yàn)檫@就是可擴(kuò)展性發(fā)揮作用的地方。數(shù)以千計(jì)的隨機(jī)用戶登錄使用該服務(wù)。這會(huì)對(duì)連接速度和性能造成壓力。它也是圖形密集型的,需要更多的微服務(wù)來(lái)確保連接順利。在流行的游戲中,后端應(yīng)該運(yùn)行可以同時(shí)擴(kuò)展和處理數(shù)千個(gè)請(qǐng)求的東西。 Go 非常適合這一點(diǎn),我們還計(jì)劃在前端使用 Go 來(lái)構(gòu)建在瀏覽器上運(yùn)行的 Web 應(yīng)用程序。我們可以通過(guò)利用WebAssembly來(lái)做到這一點(diǎn)。
2025/09/17
2025/09/17
2025/07/01
2025/07/21
2025/05/21
2025/09/05
2025/06/04
2025/08/07