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

 

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

幾乎可以用它來做任何事情 – 從創建簡單的腳本,Web 開發,到數據可視化以及機器學習。

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

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

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

image

正文

遇到的主要差異

自然,作爲第一步,我瀏覽了令人驚歎的官方“ Tour Of Go ”,這肯定給了我關於 Go 語法的強大基礎知識。

爲了加強這些知識,我閱讀了Go for Python Programmers這本電子書,使我能夠繼續下一步,我認爲這是最具教育意義的嘗試和失敗。

我使用了以前在 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 進行了簡單的可視化:

複製代碼


 
 

package main

 

func main() {

 

// create new channel of type int

 

ch := make(chan int)

 

// start new anonymous goroutine

 

go func() {

 

// send 42 to channel

 

ch <- 42

 

}()

 

// read from channel

 

<-ch

 

}

image

更多相關示例,請查看 goutoutines,channels 和 select 語句的Hootsuite 現實生活實現,或 ArdanLabs 很棒的解釋

使用 JSON

在 Go 裏面,不再使用 json.loads()。在 Python 中,反序列化 JSON 對象非常簡單,只需使用 json.loads 即可!但在 Go 中,作爲一種靜態類型語言,這種簡單的操作可能會更棘手。

在 Go 中,可以將 JSON 解析爲一種預定義結構。任何不適合該結構的字段都將被忽略,這是一個好事,可以把它當成雙方之間的預定義協議。不會需要對 JSON 中收到的數據感到“驚訝”,JSON 字段和類型需要雙方“同意”。

複製代碼


 
 

{

 

“first”:“Elad”,

 

“last”:“Leev”,

 

“location”:“IL”,

 

“id”:“93”

 

}

複製代碼


 
 

type AccountData struct {

 

First string`json:“first”`

 

Last string`json:“last”`

 

Location string`json:“location”`

 

ID string`json:“id”`

 

}

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

爲了更好地理解 Go 中如何編寫 JSON,可以查看這篇文章,或“ Go By Example ”,這是可以找到的作爲備忘單的最終資源。
如果太懶而不想把 JSON 轉換成 Go 結構?沒問題 –  這個工具可以幫你。

清潔代碼

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

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

包含 Go 的格式信息的必讀文檔是“ Effective Go”。

找到合適的庫和框架
我真的習慣了 Python 框架和庫,如 Flask,Jinja2,Requests 甚至 Kazoo,我真的很擔心找不到適合 Go 的。但是可以猜到,Go 這個偉大的社區擁有自己獨特的庫,甚至可以讓你完全忘記舊的喜好是什麼。

以下是一些個人偏好 :

Python Requests =>net/http
內置的net/http提供了 HTTP 客戶端和服務器,實現得非常棒且非常易用性好。

Flask + Jinja2 => Gin 
Gin是一個 HTTP Web 框架,具有非常簡單的 API – 路徑參數,上傳文件,分組路由(/api/v1 ,/api/v2),自定義日誌格式,提供靜態文件,HTML 渲染,真正強大的自定義中間件。這裏提供了 benchmark 參考。

CLI Creation => Cobra 
Cobra庫可用來創建功能強大的 CLI 應用,還提供了生成應用和命令文件的程序。許多廣泛使用的 Go 項目都是使用 Cobra 構建的,包括 Kubernetes,etcd 和 OpenShift。

強烈推薦的一些其他的庫是:ViperGonfig和一個很棒的列表 –  Awsome-Go

其他資源

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

[1] Francesc Campoy  – 一定要看看他的YouTube 頻道GitHub 個人資料。Francesc 還組織了一些偉大的研討會 - - Go Tooling in ActionWeb Applications Workshop
[2] GopherCon 視頻
[3] Go Web Examples
[4] 幾個 Twitter 賬戶:Golang WeeklyGopher AcademyGolang News

總結

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

目前對 Go 來說是一個激動人心的時刻,鼓勵大家都來學習併成爲 Gophers!

原文鏈接:https://medium.com/appsflyer/my-journey-from-python-to-go-3859783c6b3c

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章