Go和Python比較的話,哪個比較好?

QF董懂發表於2019-04-03

因為Go的語法和Erlang、Python類似,所以我們將這三門語言做個詳細的對比。

Go和Python比較的話,哪個比較好?

相比於Python的40個特性,Go只有31個,可以說Go在語言設計上是相當剋制的。比如,它沒有隱式的數值轉換,沒有建構函式和解構函式,沒有運算子過載,沒有預設引數,也沒有繼承,沒有泛型,沒有異常,沒有巨集,沒有函式修飾,更沒有執行緒區域性儲存。

但是Go的特點也很鮮明,比如,它擁有協程、自動垃圾回收、包管理系統、一等公民的函式、棧空間管理等。

Go作為靜態型別語言,保證了Go在執行效率、記憶體用量、型別安全都要強於Python和Erlang。

Go的資料型別也更加豐富,除了支援表、字典等複雜的資料結構,還支援指標和介面型別,這是Python和Erlang所沒有的。特別是介面型別特別強大,它提供了管理型別系統的手段。而指標型別提供了管理記憶體的手段,這讓Go進入底層軟體開發提供了強有力的支援。

Go在面對物件的特性支援上做了很多反思和取捨,它沒有類、虛擬函式、繼承、泛型等特性。Go語言中物件導向程式設計的核心是組合和方法(function)。組合很類似於C語言的struct結構體的組合方式,方法類似於Java的介面(Interface),但是使用方法上與物件更加解耦,減少了對物件內部的侵入。Erlang則不支援面對物件程式設計正規化,相比而言,Python對面對物件正規化的支援最為全面。

在函數語言程式設計的特性支援上,Erlang作為函式式語言,支援最為全面。但是基本的函式式語言特性,如lambda、高階函式、curry等,三種語言都支援。

控制流的特性支援上,三種語言都差不多。Erlang支援尾遞迴優化,這給它在函數語言程式設計上帶來便利。而Go在通過動態擴充套件協程棧的方式來支援深度遞迴呼叫。Python則在深度遞迴呼叫上經常被爆棧。

Go和Erlang的併發模型都來源於CSP,但是Erlang是基於actor和訊息傳遞(mailbox)的併發實現,Go是基於goroutine和管道(channel)的併發實現。不管Erlang的actor還是Go的goroutine,都滿足協程的特點:由程式語言實現和排程,切換在使用者態完成,建立銷燬開銷很小。至於Python,其多執行緒的切換和排程是基於作業系統實現,而且因為GIL的大坑級存在,無法真正做到並行。

而且從筆者的併發程式設計體驗上看,Erlang的函數語言程式設計語法風格和其OTP behavior框架提供的晦澀的回撥(callback)使用方法,對大部分的程式設計師,如C/C++和Java出身的程式設計師來說,有一定的入門門檻和挑戰。而被稱為“網際網路時代的C”的Go,其類C的語法和控制流,以及面對物件的程式設計正規化,程式設計體驗則好很多。


相關文章