如何在 Go 中構(gòu)建一個(gè)基本的 Web 服務(wù)器
Go 是一種大有前途的編程語言,用于構(gòu)建現(xiàn)代 Web 應(yīng)用程序和系統(tǒng)軟件。它一發(fā)布就席卷了科技行業(yè),并為 Docker、Kubernetes、Terraform、Dropbox 和 Netflix 等服務(wù)提供支持。
此外,Go 強(qiáng)大的內(nèi)置包集合使其成為 Web 編程的絕佳選擇。本文將教你如何用 Go 編寫一個(gè)基本的 Web 服務(wù)器。
導(dǎo)入必要的包
net/HTTP 包提供了創(chuàng)建 Web 服務(wù)器和客戶端所需的一切。這個(gè)包公開了幾個(gè)處理 Web 編程的有用函數(shù)。
您可以通過在源代碼頂部添加以下行來導(dǎo)入它:
import "net/http"
我們還將使用fmt包來格式化字符串,使用log包來處理錯(cuò)誤。您可以如上所示單獨(dú)導(dǎo)入它們,也可以使用單個(gè)導(dǎo)入語句分解所有包:
import (
"fmt"
"log"
"net/http"
)
導(dǎo)入所需的包后,您可以繼續(xù)編寫 main 函數(shù)。繼續(xù)并使用.go擴(kuò)展名保存源文件。如果您使用的是 Vim,請(qǐng)使用以下命令保存并退出 Vim:
:wq linuxmi.server.go
編寫主函數(shù)
Go 程序存在于 main 函數(shù)中,恰當(dāng)?shù)孛麨椤癿ain”。您需要在此處實(shí)現(xiàn)服務(wù)器調(diào)用。在源代碼中添加以下行并查看它們的作用:
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}
我們使用func關(guān)鍵字定義主函數(shù)。Go 對(duì)左大括號(hào)的放置有嚴(yán)格的規(guī)定,因此請(qǐng)確保大括號(hào)在正確的行上。main 中的第一條語句定義所有到達(dá)根 ( “/” ) 路徑的 Web 請(qǐng)求都將由index處理,index 是http.HandlerFunc類型的函數(shù)。
第二行通過http.ListenAndServe函數(shù)啟動(dòng) Web 服務(wù)器。它向服務(wù)器發(fā)出信號(hào),以持續(xù)偵聽主機(jī)端口 8080 上的傳入 HTTP 請(qǐng)求。需要此函數(shù)的第二個(gè)參數(shù)來阻止程序直到終止。
由于 http.ListenAndServe 總是返回錯(cuò)誤,我們將這個(gè)調(diào)用包裝在log.Fatal調(diào)用中。此語句記錄在服務(wù)器端生成的任何錯(cuò)誤消息。
實(shí)現(xiàn)處理函數(shù)
可以看到,主函數(shù)調(diào)用處理函數(shù)索引來處理客戶端請(qǐng)求。但是,我們還沒有為我們的服務(wù)器定義這個(gè)函數(shù)。
讓我們添加必要的語句以使索引函數(shù)可用:
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "大家好,歡迎來到Linux迷 %s!", r.URL.Path[1:])
}
此函數(shù)采用http.ResponseWriter和http.Request類型的兩個(gè)不同參數(shù)。http.ResponseWriter 參數(shù)包含服務(wù)器對(duì)傳入請(qǐng)求的響應(yīng),它以 http.Request 對(duì)象的形式出現(xiàn)。
fmt 包中的 Fprintf 函數(shù)用于顯示和操作文本字符串。我們使用它來顯示服務(wù)器對(duì)我們的網(wǎng)絡(luò)請(qǐng)求的響應(yīng)。最后,r.URL.Path[1:]組件用于獲取根路徑之后的數(shù)據(jù)。
將所有部分加在一起
將所有部分添加在一起后,您的 Go Web 服務(wù)器應(yīng)該已經(jīng)準(zhǔn)備就緒。代碼應(yīng)類似于以下內(nèi)容:
package main
import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "大家好,歡迎來到Linux迷 %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}
第一行用于將此 Go Web 服務(wù)器代碼編譯為可執(zhí)行文件。
使用 Go 構(gòu)建 Web 服務(wù)器
Go 強(qiáng)大的庫包便于初學(xué)者進(jìn)行 Web 編程。只需幾行代碼,您就可以快速開發(fā)簡單的 Web 服務(wù)器。
此外,這種編程語言強(qiáng)大的測試特性也使得敏捷編程方法的實(shí)現(xiàn)變得容易。這些是一組基于迭代開發(fā)和團(tuán)隊(duì)之間廣泛協(xié)作的軟件開發(fā)策略。