從零到一:用Go語言構(gòu)建你的第一個Web服務(wù)

使用Go語言從零開始搭建一個Web服務(wù)晰绎,包括環(huán)境搭建寓落、路由處理、中間件使用荞下、JSON和表單數(shù)據(jù)處理等關(guān)鍵步驟伶选,提供豐富的代碼示例史飞。

關(guān)注TechLead,復(fù)旦博士仰税,分享云服務(wù)領(lǐng)域全維度開發(fā)技術(shù)构资。擁有10+年互聯(lián)網(wǎng)服務(wù)架構(gòu)、AI產(chǎn)品研發(fā)經(jīng)驗陨簇、團隊管理經(jīng)驗吐绵,復(fù)旦機器人智能實驗室成員,國家級大學生賽事評審專家河绽,發(fā)表多篇SCI核心期刊學術(shù)論文己单,阿里云認證的資深架構(gòu)師,上億營收AI產(chǎn)品研發(fā)負責人葵姥。

file

環(huán)境搭建

在開始開發(fā)之前荷鼠,我們需要確保本地環(huán)境已經(jīng)安裝了Go語言開發(fā)環(huán)境。

安裝Go語言

可以從Go語言官網(wǎng)下載適合你操作系統(tǒng)的安裝包榔幸,并按照官網(wǎng)的指南進行安裝。

配置開發(fā)工具

推薦使用VS Code或GoLand進行Go語言開發(fā)矮嫉。以下是VS Code的配置步驟:

  1. 安裝VS Code編輯器削咆。
  2. 安裝Go插件:打開VS Code,進入插件市場蠢笋,搜索并安裝Go插件拨齐。
  3. 配置Go開發(fā)環(huán)境:確保Go語言的安裝路徑已添加到系統(tǒng)環(huán)境變量中。

創(chuàng)建項目結(jié)構(gòu)

創(chuàng)建一個新的項目文件夾昨寞,并初始化Go模塊瞻惋。

mkdir simple-web-server
cd simple-web-server
go mod init simple-web-server

創(chuàng)建HTTP服務(wù)器

我們將使用Go標準庫net/http來創(chuàng)建一個簡單的HTTP服務(wù)器。

引入必要的包

在項目根目錄下創(chuàng)建一個名為main.go的文件援岩,并引入必要的包歼狼。

package main

import (
    "fmt"
    "net/http"
)

創(chuàng)建簡單的HTTP處理函數(shù)

我們需要創(chuàng)建一個處理函數(shù)來響應(yīng)HTTP請求。

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

創(chuàng)建并啟動HTTP服務(wù)器

main函數(shù)中享怀,我們將創(chuàng)建HTTP服務(wù)器并指定端口號羽峰。

func main() {
    http.HandleFunc("/", helloHandler) // 設(shè)置路由
    fmt.Println("Starting server at port 8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

完整的main.go文件如下:

package main

import (
    "fmt"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    http.HandleFunc("/", helloHandler) // 設(shè)置路由
    fmt.Println("Starting server at port 8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

運行服務(wù)器

在終端中運行以下命令來啟動服務(wù)器:

go run main.go

打開瀏覽器,訪問http://localhost:8080添瓷,你將看到頁面顯示“Hello, World!”梅屉。

路由與請求處理

我們將擴展HTTP服務(wù)器,增加更多的路由和處理函數(shù)鳞贷。

添加新的路由

添加一個新的處理函數(shù)來處理/greet路徑的請求坯汤。

func greetHandler(w http.ResponseWriter, r *http.Request) {
    name := r.URL.Query().Get("name")
    if name == "" {
        name = "Guest"
    }
    fmt.Fprintf(w, "Hello, %s!", name)
}

注冊新的路由

main函數(shù)中注冊新的路由:

func main() {
    http.HandleFunc("/", helloHandler)      // 設(shè)置根路徑路由
    http.HandleFunc("/greet", greetHandler) // 設(shè)置/greet路徑路由
    fmt.Println("Starting server at port 8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

測試新的路由

重新啟動服務(wù)器,并訪問http://localhost:8080/greet?name=Go搀愧,頁面將顯示“Hello, Go!”惰聂。

處理表單數(shù)據(jù)

我們將擴展服務(wù)器以處理POST請求和表單數(shù)據(jù)疆偿。

創(chuàng)建HTML表單

添加一個新的處理函數(shù)來顯示HTML表單:

func formHandler(w http.ResponseWriter, r *http.Request) {
    html := `<html><body>
    <form method="POST" action="/submit">
        <label for="name">Name:</label>
        <input type="text" id="name" name="name">
        <input type="submit" value="Submit">
    </form>
    </body></html>`
    fmt.Fprintf(w, html)
}

處理表單提交

添加一個新的處理函數(shù)來處理表單提交:

func submitHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPost {
        http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
        return
    }
    name := r.FormValue("name")
    fmt.Fprintf(w, "Form submitted! Hello, %s!", name)
}

注冊新的路由

main函數(shù)中注冊新的路由:

func main() {
    http.HandleFunc("/", helloHandler)      // 設(shè)置根路徑路由
    http.HandleFunc("/greet", greetHandler) // 設(shè)置/greet路徑路由
    http.HandleFunc("/form", formHandler)   // 設(shè)置/form路徑路由
    http.HandleFunc("/submit", submitHandler) // 設(shè)置/submit路徑路由
    fmt.Println("Starting server at port 8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        fmt.Println("Error starting server:", err)
    }
}

測試表單功能

重新啟動服務(wù)器,并訪問http://localhost:8080/form庶近,填寫表單并提交翁脆,頁面將顯示“Form submitted! Hello, [你的名字]!”

通過以上步驟,我們已經(jīng)成功創(chuàng)建了一個簡單的Go Web服務(wù)鼻种,并實現(xiàn)了路由處理和表單數(shù)據(jù)處理反番。

如有幫助,請多關(guān)注
TeahLead KrisChang叉钥,10+年的互聯(lián)網(wǎng)和人工智能從業(yè)經(jīng)驗罢缸,10年+技術(shù)和業(yè)務(wù)團隊管理經(jīng)驗,同濟軟件工程本科投队,復(fù)旦工程管理碩士枫疆,阿里云認證云服務(wù)資深架構(gòu)師,上億營收AI產(chǎn)品業(yè)務(wù)負責人敷鸦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末息楔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扒披,更是在濱河造成了極大的恐慌值依,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碟案,死亡現(xiàn)場離奇詭異愿险,居然都是意外死亡,警方通過查閱死者的電腦和手機价说,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門辆亏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳖目,你說我怎么就攤上這事扮叨。” “怎么了疑苔?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵甫匹,是天一觀的道長。 經(jīng)常有香客問我惦费,道長兵迅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任薪贫,我火速辦了婚禮恍箭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞧省。我一直安慰自己扯夭,他們只是感情好鳍贾,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著交洗,像睡著了一般骑科。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上构拳,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天咆爽,我揣著相機與錄音,去河邊找鬼置森。 笑死斗埂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凫海。 我是一名探鬼主播呛凶,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼行贪!你這毒婦竟也來了漾稀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤建瘫,失蹤者是張志新(化名)和其女友劉穎县好,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暖混,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年翁授,在試婚紗的時候發(fā)現(xiàn)自己被綠了拣播。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡收擦,死狀恐怖贮配,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塞赂,我是刑警寧澤泪勒,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站宴猾,受9級特大地震影響圆存,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仇哆,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一沦辙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讹剔,春花似錦油讯、人聲如沸详民。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沈跨。三九已至,卻和暖如春兔综,著一層夾襖步出監(jiān)牢的瞬間饿凛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工邻奠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笤喳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓碌宴,卻偏偏與公主長得像杀狡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贰镣,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容