最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go標(biāo)準(zhǔn)庫net/http包的實現(xiàn)

 更新時間:2026年03月16日 10:08:11   作者:我叫黑大帥  
net/http是Go官方自帶的 HTTP 框架,不用裝任何第三方庫,本文就來詳細(xì)的介紹一下Go標(biāo)準(zhǔn)庫net/http包的實現(xiàn),感興趣的可以了解一下

net/http 是 Go 官方自帶的 HTTP 框架,不用裝任何第三方庫,直接就能寫:

  • HTTP 服務(wù)端(寫接口、網(wǎng)站、API)
  • HTTP 客戶端(發(fā)請求、調(diào)用別人接口)

服務(wù)端

核心 API

  • http.HandleFunc(pattern, handler): 注冊路由(將路徑和對應(yīng)的函數(shù)綁定)。
  • http.ListenAndServe(addr, handler): 啟動監(jiān)聽并服務(wù)?!付嗫蛻舳诉B接不阻塞」的核心!
  • http.ResponseWriter: 用于向客戶端寫入響應(yīng)(寫回數(shù)據(jù))。
  • *http.Request: 包含客戶端發(fā)來的所有信息(URL、Header、參數(shù)等)。
package main

import (
	"fmt"
	"net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
	// r.Method 可以判斷是 GET 還是 POST
	fmt.Fprintf(w, "你好,你訪問的路徑是: %s", r.URL.Path)
}

func main() {
	// 1. 路由注冊
	http.HandleFunc("/", helloHandler)

	// 2. 啟動服務(wù),監(jiān)聽 8080 端口
	fmt.Println("服務(wù)器啟動在 http://localhost:8080")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}

HandleFunc與接口函數(shù)

// `net/http` 定義了一個接口
type Handler interface {
    ServeHTTP(w http.ResponseWriter, r *http.Request)
}


func(w http.ResponseWriter, r *http.Request)
w http.ResponseWriter 給客戶端返回數(shù)據(jù)(寫響應(yīng))
w.Write([]byte("返回內(nèi)容"))
w.WriteHeader(404) // 設(shè)置狀態(tài)碼
fmt.Fprintln(w, "hello") // 也可以這樣寫
r *http.Request 獲取客戶端傳過來的東西
  • URL 參數(shù)
  • POST 表單 / JSON
  • 請求頭
  • 請求方法(GET/POST)

常用的 5 種HandleFunc用法

處理 GET 請求(獲取 URL 參數(shù))

http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
	// 獲取 ?name=xxx & age=xxx
	name := r.URL.Query().Get("name")
	age := r.URL.Query().Get("age")

	w.Write([]byte("名字:" + name + " 年齡:" + age))
})

處理 POST 表單(前端提交數(shù)據(jù))

http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
	// 解析 POST 表單
	r.ParseForm()

	// 獲取表單參數(shù)
	username := r.PostForm.Get("username")
	password := r.PostForm.Get("password")

	w.Write([]byte("用戶名:" + username + " 密碼:" + password))
})

返回 JSON(寫 API 接口)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

http.HandleFunc("/json", func(w http.ResponseWriter, r *http.Request) {
	user := User{Name: "張三", Age: 20}

	// 設(shè)置返回格式 JSON
	w.Header().Set("Content-Type", "application/json")

	// 編碼并返回
	json.NewEncoder(w).Encode(user)
})

路由分組 / 多個接口

// 首頁
http.HandleFunc("/", homeHandler)

// 用戶相關(guān)
http.HandleFunc("/user/list", userListHandler)
http.HandleFunc("/user/info", userInfoHandler)

// 登錄
http.HandleFunc("/login", loginHandler)

訪問靜態(tài)文件服務(wù)

// 訪問 /static/ 下的文件 
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))

ServeMux 與自定義 Handler

mux := http.NewServeMux()
mux.HandleFunc("/user", userHandler)
// 將 mux 傳入 ListenAndServe
http.ListenAndServe(":8080", mux)

直接使用 http.HandleFunc (默認(rèn)模式)

當(dāng)你直接調(diào)用 http.HandleFunc 時,Go 會在后臺使用一個全局默認(rèn)的實例,叫 DefaultServeMux

  • 優(yōu)點:代碼少,寫個小腳本測試非???。
  • 缺點:它是全局共享的。如果你引入的第三方庫也偷偷在 DefaultServeMux 上注冊了路由,可能會產(chǎn)生沖突。此外,在單元測試中,全局變量會讓測試變得互相干擾。

使用 http.NewServeMux() (自定義模式)

當(dāng)你創(chuàng)建自己的 mux 時,你是在創(chuàng)建一個隔離的路由表。

  • 優(yōu)點:更安全、更靈活。你可以創(chuàng)建多個 mux,分別跑在不同的端口上,或者在測試時輕松地替換它。
package main

import (
	"fmt"
	"net/http"
)

func main() {
	// --- 局部變量 1:給普通用戶的路由 ---
	userMux := http.NewServeMux()
	userMux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "這是【普通用戶】的個人中心")
	})

	// --- 局部變量 2:給管理員的路由 ---
	adminMux := http.NewServeMux()
	adminMux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "這是【管理員】的用戶管理界面")
	})

	// 在 8080 端口啟動用戶服務(wù)
	go http.ListenAndServe(":8080", userMux)

	// 在 9090 端口啟動管理服務(wù)
	fmt.Println("服務(wù)已啟動:8080 為用戶,9090 為管理")
	http.ListenAndServe(":9090", adminMux)
}

客戶端

常用 API

  • http.Get(url): 發(fā)送簡單的 GET 請求。
  • http.Post(url, contentType, body): 發(fā)送 POST 請求。
  • http.Client: 如果需要設(shè)置超時、Header 等高級操作,需要自定義 Client。
resp, err := http.Get("https://api.github.com")
if err != nil {
    log.Fatal(err)
}
// 記得關(guān)閉 Body,防止內(nèi)存泄漏
defer resp.Body.Close()

// 讀取響應(yīng)內(nèi)容
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))

到此這篇關(guān)于Go標(biāo)準(zhǔn)庫net/http包的實現(xiàn)的文章就介紹到這了,更多相關(guān)Go標(biāo)準(zhǔn)庫net/http包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • grpc-go如何通過context傳遞額外數(shù)據(jù)

    grpc-go如何通過context傳遞額外數(shù)據(jù)

    metadata是grpc內(nèi)置的,用RPC服務(wù)傳遞http頭數(shù)據(jù),分in和out兩種,對應(yīng)的key都為一個空struct,這篇文章主要介紹了grpc-go通過context傳遞額外數(shù)據(jù),需要的朋友可以參考下
    2024-02-02
  • Go語言狀態(tài)機(jī)的實現(xiàn)

    Go語言狀態(tài)機(jī)的實現(xiàn)

    本文主要介紹了Go語言狀態(tài)機(jī)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 詳解在Go語言單元測試中如何解決Redis存儲依賴問題

    詳解在Go語言單元測試中如何解決Redis存儲依賴問題

    在編寫單元測試時,除了?MySQL?這個外部存儲依賴,Redis?應(yīng)該是另一個最為常見的外部存儲依賴了,本文就來講解下如何解決?Redis?外部依賴,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • golang等待觸發(fā)事件的實例

    golang等待觸發(fā)事件的實例

    這篇文章主要介紹了golang等待觸發(fā)事件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang中time包之時間間隔格式化和秒、毫秒、納秒等時間戳格式輸出的方法實例

    golang中time包之時間間隔格式化和秒、毫秒、納秒等時間戳格式輸出的方法實例

    時間和日期是我們編程中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于golang中time包之時間間隔格式化和秒、毫秒、納秒等時間戳格式輸出的方法實例,需要的朋友可以參考下
    2022-08-08
  • go進(jìn)行http請求偶發(fā)EOF問題分析

    go進(jìn)行http請求偶發(fā)EOF問題分析

    go使用連接池進(jìn)行http請求,一般都能請求成功,但偶然會出現(xiàn)請求失敗返回EOF錯誤的情況,本文主要來帶大家分析一下為什么會出現(xiàn)這樣的問題并提供解決方法,需要的可以參考下
    2025-01-01
  • Golang 實現(xiàn)分片讀取http超大文件流和并發(fā)控制

    Golang 實現(xiàn)分片讀取http超大文件流和并發(fā)控制

    這篇文章主要介紹了Golang 實現(xiàn)分片讀取http超大文件流和并發(fā)控制,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang fmt占位符的使用詳解

    golang fmt占位符的使用詳解

    這篇文章主要介紹了golang fmt占位符的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang 獲取文件md5校驗的方法以及效率對比

    Golang 獲取文件md5校驗的方法以及效率對比

    這篇文章主要介紹了Golang 獲取文件md5校驗的方法以及效率對比,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言map不支持并發(fā)寫操作的原因

    Go語言map不支持并發(fā)寫操作的原因

    Go語言為什么不支持并發(fā)讀寫map?,Go官方的說法是在多數(shù)情況下map只存在并發(fā)讀操作,如果原生支持并發(fā)讀寫,即降低了并發(fā)讀操作的性能,在使用?map?時,要特別注意是否存在對?map?的并發(fā)寫操作,如果存在,要結(jié)合?sync?包的互斥鎖一起使用,
    2024-01-01

最新評論

楚雄市| 灵石县| 洪泽县| 廉江市| 治多县| 朔州市| 神木县| 承德县| 东阿县| 广州市| 温州市| 伊春市| 沁源县| 大关县| 宁阳县| 固始县| 手游| 佛坪县| 涟源市| 靖宇县| 古田县| 深圳市| 岐山县| 石台县| 香格里拉县| 彝良县| 贺州市| 清水河县| 论坛| 曲麻莱县| 顺昌县| 江达县| 江陵县| 静海县| 金门县| 饶平县| 航空| 临沂市| 乐业县| 周至县| 文登市|