使用 Python 5 年後,我轉向了Go

2021-09-17 04:05:35 字數 3149 閱讀 3719

我喜歡python,在過去的五年裡,它一直是我的首選語言。python非常友好且易於學習,迄今仍然超級有效。

幾乎可以用它來做任何事情 – 從建立簡單的指令碼,web開發,到資料視覺化以及機器學習。

但隨著go日趨成熟,強大的使用者群,事實上越來越多的公司在成功進行基準測試後決定轉向go,驅使我閱讀了大量go相關的知識,思考如何將其新增到我的工具集以便在工作中應用它的好處。

這篇文章不會討論哪種程式語言更好 – python或go,網路上有很多關於這個主題的帖子和比較,在我看來區別在很大程度上取決於用例。

在這篇文章中,我將告訴你我從python到go的旅程,並提供一些技巧,讓你了解一些幫助我在這次旅程中取得成功的資源,然後現場講述這個故事。

自然,作為第一步,我瀏覽了令人驚嘆的官方「 tour of go 」,這肯定給了我關於go語法的強大基礎知識。

我使用了以前在python中常用的函式,如json序列化或http呼叫,並嘗試在go中編寫它們。

通過這樣在go中應用python中的類似概念,並且仍然保持語言的靜態特性,我遇到了go和python之間的一些關鍵差異。

首先,python通常不需要特定的目錄層次結構,反之,go則需要。

go使用「標準」布局,這讓它比python稍微複雜一點,帶來了更多工作,但好處是結構良好的**庫,它鼓勵模組化**,在專案規模擴大時能保持有序。

官方的文章「 如何編寫go** 」有乙個章節清晰地解釋了如何構建工作區。

go是一種靜態型別的語言,由於大家習慣使用python或ruby等動態型別語言,因此初期會感到不太舒服。

毫無疑問,動態語言更容易出錯,並且在輸入的驗證上需要花費更多精力來防止常見語法或解析錯誤。想想計算兩個整數之和的某函式,實際上並不能保證使用者在使用它時不會將乙個字串傳遞給函式 – 這會導致乙個typeerror。

這種情況不會發生在go中,因為需要宣告每個變數的型別,函式可以獲得哪種型別的變數,以及函式將返回哪種型別的變數。

起初它有點煩人,感覺讓編碼速度慢了很多,但是通過短暫的go學習和編寫後,你會真正地習慣去用它,並發現實際上它能節省時間、讓**更健壯。

go利用goroutines和channels支援本機併發,現在真的很方便。

首先,channels的概念可能有點小麻煩,並且很容易被當成某種資料結構或排隊的實現。其實了解下來這些概念更加直白,可以真正享受它們帶來的價值,並進行充分的利用。

ivan daniluk對goroutines和channels進行了簡單的視覺化:

更多相關示例,請檢視goutoutines,channels和select語句的hootsuite現實生活實現,或ardanlabs很棒的解釋。

在go裡面,不再使用json.loads()。在python中,反序列化json物件非常簡單,只需使用json.loads即可!但在go中,作為一種靜態型別語言,這種簡單的操作可能會更棘手。

在go中,可以將json解析為一種預定義結構。任何不適合該結構的字段都將被忽略,這是乙個好事,可以把它當成雙方之間的預定義協議。不會需要對json中收到的資料感到「驚訝」,json欄位和型別需要雙方「同意」。

type accountdata struct
當然,仍然可以在沒有結構的情況下反序列化json,但是如果可能的話應該避免這樣做,保持語言的靜態性質總是更好的選擇。

為了更好地理解go中如何編寫json,可以檢視這篇文章,或「 go by example 」,這是可以找到的作為備忘單的最終資源。

如果太懶而不想把json轉換成go結構?沒問題 –  這個工具可以幫你。

go編譯器始終盡力保持**的清潔,將未使用的變數視為編譯錯誤。而且,go採用了獨特的方法讓計算機能處理大多數格式問題。在儲存或編譯時go會執行gofmt的程式,它會處理大多數的格式問題。

如果不關心其中的乙個變數?沒問題!只需使用 _(下劃線)並將其分配給空識別符號即可。

包含go的格式資訊的必讀文件是「 effective go」。

找到合適的庫和框架

我真的習慣了python框架和庫,如flask,jinja2,requests甚至kazoo,我真的很擔心找不到適合go的。但是可以猜到,go這個偉大的社群擁有自己獨特的庫,甚至可以讓你完全忘記舊的喜好是什麼。

以下是一些個人偏好 :

內建的net/http提供了http客戶端和伺服器,實現得非常棒且非常易用性好。

flask + jinja2=\u0026gt; gin 

gin是乙個http web框架,具有非常簡單的api – 路徑引數,上傳檔案,分組路由(/api/v1 ,/api/v2),自定義日誌格式,提供靜態檔案,html渲染,真正強大的自定義中介軟體。這裡提供了benchmark參考。

cli creation=\u0026gt; cobra 

cobra庫可用來建立功能強大的cli應用,還提供了生成應用和命令檔案的程式。許多廣泛使用的go專案都是使用cobra構建的,包括kubernetes,etcd和openshift。

強烈推薦的一些其他的庫是:viper,gonfig和乙個很棒的列表 –  awsome-go。

在我的go之旅中,下面是一些起到了極大幫助的資源:

[3] go web examples

[4] 幾個twitter賬戶:golang weekly,gopher academy,golang news。

作為一名五年狂熱的python使用者,我擔心過渡到go會很痛苦。但我真的很興奮,看到有乙個真正強大的社群,貢獻率和維護都很優秀的資源,可以幫助大家順利過渡到go。go是當今發展最快的程式語言之一,希望google能夠好好管理,讓go成為編寫雲應用和基礎架構的首選語言。

目前對go來說是乙個激動人心的時刻,鼓勵大家都來學習並成為gophers!

使用 Python 5 年後,我轉向了Go

我喜歡python,在過去的五年裡,它一直是我的首選語言。python非常友好且易於學習,迄今仍然超級有效。n幾乎可以用它來做任何事情 從建立簡單的指令碼,web開發,到資料視覺化以及機器學習。n但隨著go日趨成熟,強大的使用者群,事實上越來越多的公司在成功進行基準測試後決定轉向go,驅使我閱讀了大...

使用 Python 5 年後,我轉向了Go

我喜歡python,在過去的五年裡,它一直是我的首選語言。python非常友好且易於學習,迄今仍然超級有效。幾乎可以用它來做任何事情 從建立簡單的指令碼,web開發,到資料視覺化以及機器學習。但隨著go日趨成熟,強大的使用者群,事實上越來越多的公司在成功進行基準測試後決定轉向go,驅使我閱讀了大量g...

使用 Python 5 年後,我轉向了Go

我喜歡python,在過去的五年裡,它一直是我的首選語言。python非常友好且易於學習,迄今仍然超級有效。幾乎可以用它來做任何事情 從建立簡單的指令碼,web開發,到資料視覺化以及機器學習。但隨著go日趨成熟,強大的使用者群,事實上越來越多的公司在成功進行基準測試後決定轉向go,驅使我閱讀了大量g...