本節我們來學習如何搭建一個簡單的網站程式。
首先開啟你最喜愛的編輯器,編寫如下所示的幾行程式碼,並將其儲存為 hello.go。
package main
import (
"io"
"log"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello, world!")
}
func main() {
http.HandleFunc("/hello", helloHandler)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err.Error())
}
}
我們引入了 Go語言標準庫中的 net/http 包,主要用於提供 Web 服務,響應並處理用戶端(瀏覽器)的 HTTP請求。
同時,使用 io 包而不是 fmt 包來輸出字串,這樣原始檔編譯成可執行檔案後,體積要小很多,執行起來也更省資源。
接下來,讓我們簡單地了解 Go語言的 http 包在上述範例中所做的工作。
net/http 包簡介
可以看到,我們在 main() 方法中呼叫了 http.HandleFunc(),該方法用於分發請求,即針對某一路徑請求將其對映到指定的業務邏輯處理方法中。如果你有其他程式語言(比如 Ruby、Python 或者 PHP 等)的 Web 開發經驗,可以將其形象地理解為提供類似 URL 路由或者 URL 對映之類的功能。
在 hello.go 中,http.HandleFunc() 方法接受兩個引數,第一個引數是 HTTP 請求的目標路徑"/hello",該引數值可以是字串,也可以是字串形式的正規表示式,第二個引數指定具體的回撥方法,比如 helloHandler。
當我們的程式執行起來後,存取 http://localhost:8080/hello,程式就會去呼叫 helloHandler() 方法中的業務邏輯程式。
在上述例子中, helloHandler() 方法是 http.HandlerFunc 型別的範例,並傳入 http.ResponseWriter 和 http.Request 作為其必要的兩個引數。http.ResponseWriter 型別的物件用於包裝處理 HTTP 伺服器端的響應資訊。
我們將字串"Hello, world!"寫入型別為 http.ResponseWriter 的 w 範例中,即可將該字串資料傳送到 HTTP 用戶端。第二個引數 r *http.Request 表示的是此次 HTTP 請求的一個資料結構體,即代表一個用戶端,不過該範例中我們尚未用到它。
還看到,在 main() 方法中呼叫了 http.ListenAndServe(),該方法用於在範例中監聽 8080 埠,接受並呼叫內部程式來處理連線到此埠的請求。如果埠監聽失敗,會呼叫 log.Fatal() 方法輸出異常出錯資訊。
正如你所見,main() 方法中的短短兩行即開啟了一個 HTTP 服務,使用 Go語言的 net/http 包搭建一個 Web 是如此簡單!當然,net/http 包的作用遠不止這些,我們只用到其功能的一小部分。
試著編譯並執行當前的這份 hello.go 原始檔:
$ go run hello.go
然後在瀏覽器存取 http://localhost:8080/hello,會看到如下圖所示的介面。
圖:瀏覽器的輸出結果