使用 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 年后,我转向了Go的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫——获取联行行号
- 下一篇: js数组删除数组元素!