Go是一門什麼樣的語言?

追逐時光者發表於2021-08-01

Go語言基本介紹

  首先Go語言誕生於2007年由谷歌公司研發,2009年開源,2012年推出1.0版本,Go是一種語言層面支援併發(Go最大的特色、天生支援併發)、內建runtime,支援垃圾回收(GC)、靜態強型別,快速編譯的語言(編譯型語言)。

知識擴充:

靜態強型別語言是什麼?

靜態強型別語言=靜態型別語言+強型別語言

動態型別語言和靜態型別語言

動態型別語言

動態型別語言和動態語言是完全不同的兩個概念。
動態型別語言:是指在執行期間才去做資料型別檢查的語言,說的是資料型別,
動態語言:說的是執行是改變結構,說的是程式碼結構。
動態型別語言的資料型別不是在編譯階段決定的,而是把型別繫結延後到了執行階段。
主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

靜態型別語言

靜態語言的資料型別是在編譯期間(或執行之前)確定的,編寫程式碼的時候要明確確定變數的資料型別。
主要語言:C、C++、C#、Java、Object-C。

Go 語言是一種靜態型別的程式語言,所以在編譯器進行編譯的時候,就要知道每個值的型別,這樣編譯器就知道要為這個值分配多少記憶體,並且知道這段分配的記憶體表示什麼。

提前知道值的型別的好處有很多,比如編譯器可以合理的使用這些值,可以進一步優化程式碼,提高執行的效率,減少 bug 等等。

型別檢查

所進行的檢驗處理以及實行型別的約束,可發生在編譯時期(靜態檢查)或執行時期(動態檢查)

強型別與弱型別語言

強型別:

強型別語言是一種強制型別定義的語言,即一旦某一個變數被定義型別,如果不經強制轉換,那麼它永遠就死該資料型別。

弱型別:

弱型別語言是一種弱型別定義的語言,某一個變數被定義型別,該變數可以根據環境變化自動進行轉換,不需要經過現行強制轉換。

編譯型語言和解釋型語言區別

型別

原理

優點

缺點

編譯型語言

通過專門的編譯器,將所有原始碼一次性轉換成特定平臺(Windows、Linux 等)執行的機器碼(以可執行檔案的形式存在)。

編譯一次後,脫離了編譯器也可以執行,並且執行效率高。

可移植性差,不夠靈活。

代表語言:C、C++、Pascal、Object-C、swift

解釋型語言

由專門的直譯器,根據需要將部分原始碼臨時轉換成特定平臺的機器碼。

跨平臺性好,通過不同的直譯器,將相同的原始碼解釋成不同平臺下的機器碼。

一邊執行一邊轉換,效率很低。

代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby

混合型語言(特殊)

既然編譯型和解釋型各有缺點就會有人想到把兩種型別整合起來,取其精華去其糟粕。就出現了半編譯型語言。比如C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了中間語言執行庫執行中間碼,中間語言執行庫類CLR(CLR公共語言執行是讓 .NET 程式執行所需的外部服務的集合,.NET 平臺的核心和最重要的元件,類似於 Java 的 JVM)。.NET在編譯成IL程式碼後,儲存在dll中,首次執行時由JIT在編譯成機器碼快取在記憶體中,下次直接執行。我個人認為拋開一切的偏見C#是這個星球上最好的程式語言。可惜微軟的政策限制了C#的推廣。

Java是一種特殊的高階性語言,它既有解釋性語言的特徵,也有編譯性語言的特徵,因為它是經過先編譯,後解釋的過程。
簡單說:HelloWorld.java————>HelloWolrd.class————>特定平臺的機器程式碼
①編譯 ②解釋

Go語言的特點有哪些?

  • 語法簡潔。

簡單好記的關鍵詞和語法。golang語法簡單,這個是真的簡單,即使從來沒接觸過過程式設計的使用者,都可以輕鬆上手,比c++、java、.net更簡單易學,甚至比php學起來都輕鬆。與同為強型別語言的比c++比,更是簡單得多。雖然簡單,但是實現起功能來,一點也不含糊。

  • 開發效率高。

GO語言使用起來簡單、程式碼描述效率高、編碼規範統一、上手快。 通過少量的程式碼,即可實現框架的標準化,能快速的構建各種通用元件和公共類庫,進一步提升開發效率,實現特定場景下的功能量產。

  • 良好的語言設計。

從學術的角度講Go語言其實非常平庸,不支援許多高階的語言特性;但從工程的角度講,Go的設計是非常優秀的:規範足夠簡單靈活,有其他語言基礎的程式設計師都能迅速上手。更重要的是Go自帶完善的工具鏈,大大提高了團隊協作的一致性。比如gofmt自動排版Go程式碼,很大程度上杜絕了不同人寫的程式碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動執行gofmt,這樣在編寫程式碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的程式碼。此外還有gofix, govet等非常有用的工具。

  • 部署簡單。

Go編譯生成的是一個靜態可執行的檔案,除了glibc外沒有其他外部依賴。這讓部署變得非常的方便:目標機器上只需要一個基礎的系統和必要的管理、監控工具,完全不需要操心應用所需要的各種包、庫的以來關係,大大減少了維護的負擔。

  • 併發性好。

Goroutine(Go輕量級執行緒)和channel使得編寫高併發的服務端軟體變得相當的容易,很多情況下完全可以不需要考慮鎖機制以及由此帶來的各種問題。單個Go應用也能有效的利用多個CPU核並行執行的效能好。

  • 執行效能強。

畢竟是類C的執行速度,對於一些服務來說,效能是極其重要的一環,事關係統的吞吐、訪問的延遲,進而會影響使用者的體驗,Go語言通過協程可以方便的實現並行處理,達到處理效率的最大化 ,提升系統的吞吐能力。

  • 執行效能好。

雖然不如C和Java,但通常比原生Python應用還是高一個數量級的,適合編寫—些瓶頸業務。記憶體佔用也非常省。

參考

程式語言傻傻分不清:弱型別、強型別、動態型別、靜態型別

 

相關文章