原本這是在 Quora 討論區上出現的一個問題,筆者當時也發文回答。因這個議題蠻有意思的,筆者將其重新整理後用中文寫出來,網頁程式的初學者可以參考參考。由於這類議題帶有個人主觀的成分,其實沒有標準答案;程式語言和函式庫畢竟是工具,工具只要順手合用即可。
現在學網頁程式,網頁框架是顯學,不過,也有像 Golang 或 PHP 等不用網頁框架也能有效率地寫出網頁程式的語言。PHP 原本的概念是和 C 語言搭配使用的模板語言 (template language),由於簡單易學,很快就變成當時主流的網頁後端語言;但 PHP 的發展卻偏離原本的設計,幾乎沒有程式人把 PHP 搭配 C 來使用,都是單寫 PHP 程式。由於 PHP 很容易寫出難以維護的程式,後來也出現像 Laravel 等用 PHP 所寫的網頁框架,用來改善 PHP 網頁程式的工程性。以本文要介紹的 Golang 來說,Golang 本身無法做為模板語言,而是透過函式庫來支援網頁程式。
雖然 Golang 也有一些網頁框架,但其實 Golang 可以不依賴任何網頁框架就撰寫網頁程式;筆者以為,至少要用 Golang 內建函式庫寫過一輪網頁程式,之後要用網頁框架再說。標準函式庫會隨著 Go 語言本身共生共榮,而第三方網頁框架有可能被棄置;實際上有幾個網頁框架已經停止開發了,有興趣的讀者可以自行搜尋看看。
為什麼 Golang 適合做為網頁後端程式的語言呢?由於 Golang 有以下的優點:
- Golang 易學易用:Golang 基本上是強化版的 C 語言,都以核心語法短小精要著稱
- Golang 是靜態型別語言:很多程式的錯誤在編譯期就會挑出來,相對易於除錯
- Golang 編譯速度很快:帶動整個開發的流程更快速
- Golang 支援垃圾回收:網頁程式較接近應用程式,而非系統程式,垃圾回收在這個情境下不算缺點;此外,使用垃圾回收可簡化程式碼
- Golang 內建共時性的語法:goroutine 比起傳統的執行緒 (thread) 來說輕量得多,在高負載時所需開銷更少
- Golang 是跨平台的:只要程式中不碰到 C 函式庫,在 Windows (或 Mac) 寫好的 Golang 網頁程式,可以不經修改就直接發布在 GNU/Linux 伺服器上
- Golang 的專案不需額外的設定檔:在專案中,只要放 Golang 程式碼和一些 assets 即可運作,所需的工具皆內建在 Golang 主程式中,省去學習專案設罝的功夫
- Golang 沒有死硬的程式架構:用 Golang 寫網頁程式思維上接近微框架 (micro-framework),只要少數樣板程式碼就可以寫出網頁程式,也不限定可用的第三方函式庫
但 Golang 並非完美無缺,以下是要考量的點:
- Golang 並非完整的物件導向 (object-oriented) 語言,頂多是基於物件的 (object-based) 語言
- Golang 的語言特性相對少:這是 Golang 時常被攻擊的點,這只能靠自己調整寫程式的習慣
- 承上,在一些情境下,Golang 程式碼相對笨拙冗餘,像是排序 (sorting)
寫程式重要的是最後的產出,語法特性少只是要用不同的手法來達到相同的效果;因此,筆者認為 Golang 仍然適合做為網頁後端的程式。
國內對於 Golang 的專書算少,但國外已經有不少 Golang 或 Golang 網頁程式的教材。附帶一提,筆者在這裡寫了 Golang 語法的教學,並在這裡撰寫 Golang 網頁程式的教學,需要的讀者可以參考。