作為如今火了半邊天的動態語言 Python ,憑藉著較強的靈活性、可移植、可擴展等特性廣受開發者喜愛。但是和 Google 的第二款開源程式語言 Go 相比,Python 的性能完全處於較弱一方。
在此局面下,「棄 Python 而擁抱 Go」的言論不絕於耳,但是我們究竟該怎麼做才能遷移成功?其中又有哪些值得關注的點?在本文中,作者不論語言好壞,只談從 Python 到 Go 的經驗分享,希望對大家有所裨益。
作者 | Elad Leev
譯者 | 姜松浩責編 | 屠敏出品 | CSDN(ID:CSDNNews)
以下為譯文:
我喜歡Python。在過去的五年里,它一直是我的首選語言。Python非常友好並且易於學習,同時還保持著超級的效率。
從創建簡單的腳本和Web開發,到數據可視化和機器學習,你幾乎可以隨時使用它。
但隨著Go的逐漸成熟、強大的用戶基礎,以及越來越多的公司在經過成功的基準測試後決定轉向Go的事實,使我更加廣泛地閱讀了Go,同時思考如何將其添加到我的工具集中並將它的好處應用到我的工作當中。
這篇文章不會討論Python或Go哪種程式語言更好,線上有很多關於這個主題的帖子和比較,而且我認為這種問題在很大程度上取決於項目。
在這篇文章中,我將告訴你我從Python到Go的旅程,並為你提供一些技巧,讓你了解一些幫助我在這次旅程中取得成功的資源。
我遇到的主要差異
當然,作為第一步,我瀏覽了令人嘆為觀止的官方「Tour Of Go」(https://tour.golang.org/welcome/),這確實讓我有了良好的關於Go語法的基礎知識。
為了加強這些知識,我閱讀了電子書Go for Python Programmers(https://golang-for-python-programmers.readthedocs.io/),這使我能夠繼續下一步,嘗試和失敗,我認為這是最具教育意義的。
我使用了以前在Python中使用的常用函數,如JSON序列化或使用HTTP調用,並嘗試在Go中編寫它們。
通過在Go中應用來自Python中的類似概念,同時仍然包含語言的靜態特性,我遇到了Go和Python之間的一些關鍵性的差異。
1.項目布局
首先,Python典型的不需要特定的目錄層次結構,而Go則另外需要。
Go使用「標準」布局,這種布局稍微複雜一點,這使得增加了更多的工作,但好處是擁有結構良好的代碼基礎。這種代碼基礎鼓勵模塊化代碼,並在項目規模擴大時仍能保持有序性。
官方的「How to Write Go Code」(https://golang.org/doc/code.html)有一個部分可以解釋如何構建你的工作區。
2.靜態和強類型
Go是一種靜態類型的語言,由於你習慣使用Python或Ruby等動態類型語言,因此最初會讓你感到不舒服。
毫無疑問,動態語言更容易出錯,並且在輸入驗證方面需要花費更多精力來防止常見語法錯誤或解析錯誤。思考一個函數,他是計算兩個整數之和的函數,但實際上你並不能保證使用此函數的用戶不會將字符串傳遞給函數,因此這就會導致TypeError。
這種情況不會發生在Go中,因為你需要聲明每個變量的類型,也就是說你的函數可以獲得哪種類型的變量,以及函數將返回哪種類型的變量。
起初它有點煩人,感覺它讓我的編碼速度慢了很多,但是在很短的時間的閱讀和編寫Go的代碼後,你發現已經習慣它了,它實際上可以節省時間,並使你的代碼更加的魯棒。
3.天生的並發性
Go具有天生的並發特性它支持使用goroutines和channel,這些可以使並發非常的方便。
首先,channel的概念可能有點棘手,並且很容易將其視為某種數據結構或排隊實現。但是,經過一些閱讀後,它們變得更加直白,你可以真正享受它們帶來的價值,並充分利用它們。
如下是,一個簡單的可視化的goroutines和channel:
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
}
有關更多示例,請查看Hootsuite real life implementation(http://code.hootsuite.com/golang-routines-and-channels/),或者查看這個(https://www.ardanlabs.com/blog/2017/10/the-behavior-of-channels.html),一個來自ArdanLabs的優秀解釋。
4.使用JSON
好吧,不再有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編碼,你可以查看這篇文章(https://gobyexample.com/json),或使用「Go By Example」(https://gobyexample.com/json),「Go By Example」是你將擁有的終極備忘資源。
太懶了,不願意把你的JSON轉換成Go結構?沒問題 - 這個工具會幫你做(https://mholt.github.io/json-to-go/)。
5.清潔的代碼
Go編譯器將始終盡力保持代碼清潔。
Go編譯器將未使用的變量視為編譯錯誤,而且,Go採用了獨特的方法讓機器處理大多數格式問題。
Go將在保存或編譯時運行gofmt程序,它將處理大多數格式問題。
你不關心其中一個變量?再次 - 沒問題!只需使用_(下劃線)並將其分配給空標識符就可以了。
包含Go格式信息的必讀文檔是「Effective Go」(https://golang.org/doc/effective_go.html)。
找到合適的庫和框架
我真的習慣了我的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(https://github.com/gin-gonic/gin/blob/master/BENCHMARKS.md)。
-
CLI Creation=> Cobra
Cobra是一個用於創建功能強大的CLI應用程式的庫,同時也是用於生成應用程式和命令文件的程序。
最廣泛使用的Go項目中許多都是使用Cobra構建的,包括Kubernetes、etcd還有OpenShift。
我強烈推薦的其他一些庫是:Viper,Gonfig還有Awsome-Go。
其他資源
以下是一些其他的資源,這些資源在我的Go之旅中能夠顯著的幫助到我。
-
Francesc Campoy(https://twitter.com/francesc)- 你肯定需要查看他的YouTube頻道和GitHub資料(https://github.com/campoy)。
Francesc也有一些很多偉大的工作,例如Go Tooling in Action(https://github.com/campoy/go-tooling-workshop)和Web Applications Workshop(https://github.com/campoy/go-web-workshop)。
-
GopherCon Videos(https://www.youtube.com/channel/UCx9QVEApa5BKLw9r8cnOFEA/playlists,需科學上網)
-
Go Web Examples(https://gowebexamples.com/)
-
Golang Weekly(https://twitter.com/golangweekly), Gopher Academy(https://twitter.com/GopherAcademy), Golang News(https://twitter.com/golangnews)的 Twitter帳戶(需科學上網)。
總結
作為一名使用五年Python的狂熱分子,我擔心過渡到Go會很痛苦。
但我真的很興奮,看到有一個真正強大的社區,能夠貢獻和維護優秀的資源。這樣的社區可以幫助你順利過渡到Go。
Go是當今發展最快的程式語言之一,我希望將來Go能夠成為Google編寫雲應用程式和基礎架構的首選語言。
對Go來說這是一個激動人心的時刻,我鼓勵大家去看看,並且成為Gophers!
原文:https://medium.com/appsflyer/my-journey-from-python-to-go-3859783c6b3c
本文為 CSDN 翻譯,如需轉載,請註明來源出處。作者獨立觀點,不代表 CSDN 立場。