使用 Python 5 年後,我轉向了Go
我喜歡Python,在過去的五年裡,它一直是我的首選語言。Python非常友好且易於學習,迄今仍然超級有效。
幾乎可以用它來做任何事情 – 從建立簡單的指令碼,Web開發,到資料視覺化以及機器學習。
但隨著Go日趨成熟,強大的使用者群,事實上越來越多的公司在成功進行基準測試後決定轉向Go,驅使我閱讀了大量Go相關的知識,思考如何將其新增到我的工具集以便在工作中應用它的好處。
這篇文章不會討論哪種程式語言更好 – Python或Go,網路上有很多關於這個主題的帖子和比較,在我看來區別在很大程度上取決於用例。
在這篇文章中,我將告訴你我從Python到Go的旅程,並提供一些技巧,讓你瞭解一些幫助我在這次旅程中取得成功的資源,然後現場講述這個故事。
正文
遇到的主要差異
自然,作為第一步,我瀏覽了令人驚歎的官方“ 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 mainfunc main() { // create new channel of type int ch := make(chan int)// start new anonymous goroutine go func() { // send 42 to channel ch \u0026lt;- 42 }() // read from channel \u0026lt;-ch}
更多相關示例,請檢視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 =\u0026gt;net/http
內建的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之旅中,下面是一些起到了極大幫助的資源:
[1] Francesc Campoy – 一定要看看他的YouTube頻道和GitHub個人資料。Francesc還組織了一些偉大的研討會 - - Go Tooling in Action和Web Applications Workshop。
[2] GopherCon視訊
[3] Go Web Examples
[4] 幾個Twitter賬戶:Golang Weekly,Gopher Academy,Golang News。
總結
作為一名五年狂熱的Python使用者,我擔心過渡到Go會很痛苦。但我真的很興奮,看到有一個真正強大的社群,貢獻率和維護都很優秀的資源,可以幫助大家順利過渡到Go。Go是當今發展最快的程式語言之一,希望Google能夠好好管理,讓Go成為編寫雲應用和基礎架構的首選語言。
目前對Go來說是一個激動人心的時刻,鼓勵大家都來學習併成為Gophers!
原文連結:https://medium.com/appsflyer/my-journey-from-python-to-go-3859783c6b3c
相關文章
- 使用 Python 5 年後,我轉向了 GoPythonGo
- 我為什麼從python轉向goPythonGo
- 做了5年的Android,我轉Java後臺了!AndroidJava
- 開發了5年android,我開始了go學習之旅AndroidGo
- 我為何從 Python 轉向 ErlangPython
- 用RabbitMQ了好幾年之後,我總結出來5點RabbitMQ的使用心得MQ
- 放棄Python轉向Go語言:我們找到了以下9大理由PythonGo
- 厭煩了搜狗輸入法我轉向谷歌拼音谷歌
- [譯] 為什麼我放棄了 React 而轉向 Vue。ReactVue
- 【轉載】騰訊運維10年,我斬獲了這5把“殺手鐗”運維
- 寫了 50 萬行 Go 程式碼後,我明白這些道理Go
- 不使用DDD的後果:為什麼我們停止了向微服務的遷移? - Steven Lemon微服務
- 從.NET轉GO了Go
- 學了風變程式設計Python後我終於不用加班了!程式設計Python
- 我的 Java 轉 Go 之路JavaGo
- 我的那些年(12)~公司技術轉行,我也跟著轉到java了Java
- Go 面試官問我如何實現物件導向?Go面試物件
- 帶了兩年團隊後,我又要回歸碼農了 | 掘金年度徵文
- 學習了風變程式設計後,Python為我敞開了大門程式設計Python
- Go的位操作(&, |, ^, &^) 之我裂開了!Go
- 【Python】5.物件導向的PythonPython物件
- Python 寫了一個 PDF 轉換器,以後再也不用花錢轉了Python
- JavaScript之坑了我--物件導向預熱JavaScript物件
- 我用了20年ERP系統,但是用它做報表,我卻後悔了
- 用 Python 寫了一個PDF轉換器,以後再也不用花錢轉了Python
- 快速排序--洛谷卡TLE後最終我還是選擇了三向切割排序
- 我好像發現了一個Go的Bug?Go
- 我為什麼從php轉go?PHPGo
- 我學習使用java的一點體會(5) (轉)Java
- 為什麼我從 Angular 轉向 ReactAngularReact
- 我認識的python(5)Python
- Python進階教程5——物件導向Python物件
- 用它 5 分鐘以後,我放棄用了四年的 FlaskFlask
- 5分鐘GET我使用Github 5 年總結的這些騷操作!Github
- 答應我,別在go專案中用init()了Go
- Bowery為什麼從Node.js轉向 GoNode.jsGo
- 使用 Go 優化我們的介面Go優化
- 自學python半年,我入職了......Python