為雲端而生的語言
Go 語言的主要標的是網頁程式 (web applications) 和雲端服務 (cloud services);可以想成一個比 Node.js 運行環境更高效,比 JavaScript 工程性更好,比 C++ 簡單得多的後端程式語言。Go 適合寫後端程式已經不是什麼新聞,我們應該要知道採用這個工具所帶來的優缺點。此處簡要地列出 Go 的優點:
- 易學易用
- 靜態型別
- 編譯快速
- 內建共時性語法,不需使用函式庫
- 支援垃圾回收
- 豐富的函式庫,內含完整後端相關套件
- 良好的工具鏈
- 簡易的專案設定方式
內建函式庫 vs. 第三方框架
在討論這個議題前,我們列出一些其他語言的例子,用來和 Go 做比較。
Python 和 Ruby 內建 CGI 模組,但在目前的實務上不會有程式人用 CGI 寫網頁程式。目前這兩個語言最主流的網頁框架分別為 Django 和 Rails,除此之外,還有一些流行度相對較低的微型框架,像是 Flask 和 Sinatra 等;這兩個語言的使用者通常會用網頁框架來寫網頁程式。
PHP 原本是輔助 C 語言的 CGI 程式的模板語言,但絕大部分的程式人直接使用 PHP 來寫網頁程式,把模板和程式邏輯寫在一起;PHP 給人的不良印象一部分來自於 PHP 的「義大利麵」程式碼。為了改善 PHP 的弱點,後來出現許多用 PHP 寫的網頁框架,一些知名的例子像是 Laravel 等,PHP 的定位逐漸從模板語言變成如同 Python 或 Ruby 般的後端語言。
Java 也是一個常用來寫網頁程式的技術框架。Java 用來撰寫網頁的方式並不是固定的,而歷經數次變化。一開始使用類似 CGI 的 Servlet,後來出現類似 PHP (模板語言) 的 JSP,後來也漸漸轉向使用一些網頁框架,像是先前的 Struts 和最近很紅的 Spring 等。
由上面一些工具可知,寫網頁的工具大略可分為
- CGI
- 模板語言
- MVC 網頁框架
- 微框架
前兩種大概變成時代的眼淚,目前主流是 (3),至於 (4) 也有一部分程式人使用。
現在更進階的是前端技術的興起,像是前端框架的流行、前後端分離的專案架構、使用漸進式網頁應用程式 (progressive web application)、WebAssembly 的興起等,但一開始不用急著學這些新興技術,先將網頁程式穩紮穩打學好比較實際。
以 Golang (Go 語言) 來說,寫網頁的方式分為內建函式庫和第三方網頁框架兩派,這兩種方式都各自有支持者。如果觀察一些市面上的教學資源,可發現較傾向內建函式庫;筆者以為,內建函式庫是由 Go 官方團隊所支援的,支援期間會比第三方框架來得更加長久。
註:有一些社群主導的 Go 網頁框架的確已停止開發,像 Martini 和 Arasu 等。
如果觀察一些以內建函式庫寫的網頁程式,可發現雖然是使用的是函式庫而非網頁框架,但寫起來不太像 CGI 程式,而會貼近微框架的感覺,隱隱約約有一定的套路可遵守。此外,使用內建函式庫並不代表我們不使用第三方函式庫,只是大部分的功能用內建函式庫,當內建的套件功能不足時,自然會找尋社群套件來補足。
本系列文章的方向
我們會儘量專注在如何用 Go 寫網頁程式上,對於其他的相關技術,像是 HTML、CSS、JavaScript、資料庫等不會著墨太多,因為每個技術都要詳談的話,這個系列的長度會過度膨脹,失去應有的焦點。讀者應該要試著閱讀不同主題的教學資料,再將其重新組合起來。
我們會側重在內建函式庫的使用,必要時搭配一些第三方套件,而不會使用網頁框架,理由已於前文述及。另外,使用函式庫寫程式,程式碼是一點一滴建立起來的,學習曲線相對平滑;網頁框架一開始就有較多的樣板程式碼和專案設置,比較適合會寫網頁程式的老手快速建置產品,反而不適合直接拿來學習。
我們文章中的範例網頁程式走的是傳統路線,將前端程式和後端程式耦合 (coupling) 在同一個專案中。現在的網頁程式,為了分工和擴展方便,多採用前後端分離的架構。前後端程式間以 CORS 等方式傳遞資料。但前後端分離要同時管理兩個專案,對初學者來說較為困難。故我們先走傳統路線,等學熟後可再自行改用這類架構。
我們會專注在網頁程式上,不會從頭講解 Go 的基本語法;如果需要這方面的內容,筆者先前在這裡撰文介紹 Go 語言,有需要的讀者可以自行參考。