為什麼很多公司都開始使用Go語言了?

語言: CN / TW / HK

theme: channing-cyan highlight: night-owl


“我正在參加「掘金·啟航計劃」”

為什麼很多公司都開始使用Go語言了?

寫在前面

最近和幾個小夥伴們在寫字節跳動第五屆青訓營後端組的大作業。

接近尾期了,是時候做一些總結了,那從什麼地方開始呢?那就從我們為什麼要選擇Go語言開始吧~


越來越多的互聯網大廠開始使用Go語言了,譬如騰訊、美團、滴滴、百度、Google、bilibili...

還有最初使用Python的字節跳動,甚至已經全面擁向Go了。這麼多國內外首屈一指的公司,都在開始使用它了,它到底有什麼優勢呢?這就得談談它的一些優勢了。

ps:當然了,還有Go-To-Byte的成員,想要學習go語言,並且用它完成青訓營的大項目吶~

Go的一些優勢

説起優勢,在某些方面多半是因為它有一些別人沒有的特性,或者優化了別人麻煩的地方,相比起來,才會更勝一籌。那我們來了解一下Go的一些特點吧,但在瞭解生硬的特點之前,我們先來看看其它幾種常見的語言:

常見的一些語言

這裏不是對比喲,不是説誰好誰壞,而是小馬過河,因人而異~

1、C/C++

C語言是在1971年的時候,被大神Ken Thompson和Dennis Ritchie發明的,而Go語言的主導開發者之一就是Ken Thompson,所以在很多地方和C語言類似,(比如struct、Printf、&取值符)

C/C++也作為很多初學初學的語言,它們都是直接編譯為機器碼,所以執行效率會更高,並且都不需要執行環境,用户的使用成本會更低,不像很多語言還需要安裝所需的環境。

也因為這些原因,它們的一次編碼或編譯只適用於一種平台,對於不同操作系統而言,有時需要修改編碼再編譯,有時直接重新編譯即可。

而且對於開發者也"很不友好"😒,需要自己處理垃圾回收(GC)的問題。編碼時,還需要考慮,堆上的內存什麼時候free、delete?代碼會不會造成內存泄露、不安全?

2、Java

自己作為一個從Java來學習Go的菜鳥,還未正式開發,就感到開發效率會比Java低了(個人感覺,不喜勿噴)~😁

Java直接編譯成字節碼(.class),這種編譯產物是介於原始編碼和機器碼的一種中間碼。這樣的話,Java程序就需要特定的執行環境(JVM)了,執行效率相比會低一些,還可能有虛擬化損失。但是這樣也有一個好處就是可以編譯一次,多處執行(跨平台)。而且它也是自帶GC

3、JavaScript

Python一樣,JS是一種解釋型語言,它們不需要編譯,解釋後即可運行。所以Js也是需要特定的執行環境(瀏覽器引擎) 的。

將其代碼放入瀏覽器後,瀏覽器需要解析代碼,所以也會有虛擬化損失Js只需要瀏覽器即可運行,所以它也是跨平台的。

再談Go

看完了前面幾種常見語言的簡單介紹。C/C++性能很高,因為它直接編譯為二進制,且沒有虛擬化損失,Go覺得還不錯;Java自動垃圾回收機制很好,Go覺得也不錯;Js一次編碼可以適用可以適用多種平台Go覺得好極了;而且Go天然具備高併發的能力,是所有語言無可比及的。那我們來簡單總結一下吧!

  1. 自帶運行環境Runtime,且無須處理GC問題

Go程序的運行環境可厲害了,其實大部分語言都有Runtime的概念,比如Java,它程序的運行環境是JVM,需要單獨安裝。對於Java程序,如果不經過特殊處理,只能運行在有JMV環境的機器上。

Go程序是自帶運行環境的,Go程序的Runtime會作為程序的一部分打包進二進制產物,和用户程序一起運行,也就是説Runtime也是一系列.go代碼和彙編代碼等,用户可以“直接”調用Runtime的函數(比如make([]int, 2, 6),這樣的語法,其實就是去調用Runtime中的makeslice函數)。對於Go程序,簡單來説就是不需要安裝額外的運行環境,即可運行。除非你需要開發Go的程序。

正因為這樣,Go程序也無須處理GC的問題,全權交由Runtime處理(反正要打包到一起)

  1. 快速編譯,且跨平台

不同於C/C++,對於多個平台,可能需要修改代碼後再編譯。也不同於Java的一次編碼,編譯成中間碼運行在多個平台的虛擬機上。Go只需要一次編碼,就能輕鬆在多個平台編譯成機器碼運行。

值得一提的就是它這跨平台的能力也是Runtime賦予的,因為Runtime有一定屏蔽系統調用的能力。

  1. 天然支持高性能高併發,且語法簡單、學習曲線平緩

C++處理併發的能力也不弱,但由於C++的編碼要求很高,如果不是很老練、專業的C++程序員,可能會出很多故障。而Go可能經驗不是那麼豐厚,也能寫出性能很好的高併發程序。

值得一提的就是它這超強的高併發,也是Runtime賦予的去處理協程調度能力。

  1. 豐富的標準庫、完善的工具鏈

對於開發者而言,安裝好Golang的環境後,就能用官方的標準庫開發很多功能了。比如下圖所示的很多常用包:

image-20230117173236742

而且Go自身就具有豐富的工具鏈(比如:代碼格式化、單元測試、基準測試、包管理...)

  1. 。。。。。。

很多大廠開始使用Go語言、我們團隊為什麼使用GoLang,和這些特性,多少都有一些關係吧~