北冥you鱼头像

Go 语言 net/http 常见用法指南

1. 引言

net/http 是 Go 标准库中最常用的包之一,它同时提供了 HTTP 客户端与服务端的实现。得益于标准库的完整性和 Go 的并发模型,我们无需引入任何第三方框架,就能快速构建一个生产可用的 HTTP 服务。

本文围绕日常开发中最常见的场景,梳理 net/http 的核心用法,包括服务端路由、请求处理、中间件、客户端请求、超时控制与优雅关闭等,并给出可直接运行的示例代码。

2. 快速开始:一个最小的 HTTP 服务

使用 http.HandleFunc 注册路由,再调用 http.ListenAndServe 启动服务,是最简单的写法。

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
   
   
	http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
   
   
		fmt.Fprintf(w, "Hello, %s!", r.URL.Query().Get("name"))
	})

	log.Println("server listening on :8080")
	if err := http.ListenAndServe(":8080", nil); err != nil {
   
   
		log.Fatal(err)
	}
}

运行后访问 http://localhost:8080/hello?name=Go,即可看到返回结果。

需要注意:http.ListenAndServe 的第二个参数为 nil 时,使用的是 http.DefaultServeMux 这个全局默认路由器。在稍大的项目中,更推荐显式创建自己的 ServeMux,避免全局状态带来的隐式耦合。

3. 路由与 ServeMux

3.1 基础路由注册

http.ServeMux 支持按路径前缀匹配,以 / 结尾的模式表示子树匹配。

mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
   
   
	w.Write([]byte("index"))
})
mux.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
   
   
	w.Write([]byte("api prefix"))
})
mux.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
   
   
	w.Write([]byte("users"))
})

匹配规则是「最长前缀优先」,因此 /api/users 会优先于 /api/ 命中。

3.2 Go 1.22 之后的方法与路径参数

从 Go 1.22 开始,ServeMux 支持在模式中声明 HTTP 方法和路径通配符,这让标准库路由能力大幅增强。

mux := http.NewServeMux()

mux.HandleFunc("GET /users/{id}", func(w http.<

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/u011175571/article/details/170656635

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--