由於golang對於web的支援先天相當優良,再加上容易擴充的特性,golang的網路框架可說是百花齊放,不像其他語言通常會有一個強者最終一統天下(例如Rails之於Ruby),然後資源集中,變得越來越成熟的良性循環。要在眾多golang框架中挑選一個來使用,不是一件容易抉擇的事情。尤其對於golang來說,如果只是輕量級服務,也沒有非得要使用框架的必要。因為原生golang對於網路server的支援程度幾乎等同於其他腳本語言輕量級網路框架,例如Ruby的sinatra。
再者,即使真的遇到了原生所不足的地方,比如說不友善的router設定、session管理等等,也不一定需要引入整個框架,可以只引用需要的函數包(Package)即可。追根究底,引用整個建構完整的web framework這件事,就與golang的核心精神相違背。經過了這幾天的相處下來,各位應該已經注意到golang語言的幾個核心精神(個性),就是討厭冗餘到了偏執的程度,並且願意高度限縮自我,追求紀律來降低錯誤的發生。框架幾乎天生就無法避免冗餘,我們只會用到其中的一部分,而忽略了引入的其他部分。這點在間接上可能會拖累效能,這也是為什麼軟體屆有個趨勢,「能使用原生盡量不用外掛」,也是以效能作為考量。
即使如此,優秀的框架還是可以節省我們許多時間,並且透過別人精巧的設計了解這門語言的最佳實踐。避免重複造輪是近代軟體工程很重要的一個精神,雖然單就golang的網路框架來說,重複造輪的框架競賽一時還看不到終點(也有很多人呼籲不要再繼續創造輪子了)。
畢竟是多年來常見的考古題,有人已經整理了常見的框架github星星數、fork數與issue數,可以藉此判斷框架在工程師社群中受歡迎的程度。畢竟受歡迎的框架才容易找到技術支援,也不容易成為技術孤兒(例如已經停止更新的martini)。以下就是前六名:
(資料時間為2018/11/1,出處)
今天是鐵人賽的第26天,雖然不一定寫到30天為止,但我大概也不會六種都拿出來玩看看。前三名的gin、beego、iris是各大論壇推薦的常客,也實至名歸的擁有最多星星數(先不考慮衝榜造假的可能),接下來的幾天會分別介紹這三種框架,希望對各位有幫助。
後記:這樣框架的比較,讓我想起我去年的鐵人賽主題。坦白說我今年其實也可以考慮就單純寫這六種框架,大概也會花三十天吧XD