Go HTTP服务器核心是net/http库,用http.HandleFunc或ServeMux注册处理器,通过r.Method、r.URL.Query()等解析请求,用w.WriteHeader、w.Header()和json.NewEncoder构造响应。

在 Go 中实现 HTTP 服务器,核心是使用标准库 net/http,它轻量、高效且无需额外依赖。处理路由和请求响应的关键在于:用 http.HandleFunc 或 http.ServeMux 注册路径处理器,并在处理器函数中解析请求、构造响应。
基础 HTTP 服务器:监听与响应
最简服务只需调用 http.ListenAndServe,配合一个处理函数:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
http.ListenAndServe(":8080", nil)
}
这里 nil 表示使用默认的 http.DefaultServeMux,所有注册的路径都由它分发。
自定义路由:用 ServeMux 管理多路径
显式创建 http.ServeMux 更清晰,便于组织和复用:
- 用
mux.HandleFunc("/users", usersHandler)注册具体路径 - 用
mux.Handle("/api/", http.StripPrefix("/api", apiHandler))处理子路径前缀 - 支持通配符匹配(如
/static/匹配所有以该前缀开头的路径)
注意:路径末尾是否带 / 决定匹配行为 —— "/users/" 会匹配 /users/123,但不匹配 /users;而 "/users" 只精确匹配该路径。
解析请求:方法、参数与数据体
在处理器函数中,可通过 *http.Request 获取完整上下文:
-
r.Method判断是 GET、POST、PUT 等 -
r.URL.Query().Get("id")获取 URL 查询参数 -
r.FormValue("name")同时支持查询参数和表单数据(自动调用ParseForm) -
io.ReadAll(r.Body)读取 JSON 或原始请求体(注意:Body 只能读一次,需提前保存)
对 JSON 请求,常用 json.NewDecoder(r.Body).Decode(&data) 直接反序列化。
构造响应:状态码、头信息与格式化输出
响应通过 http.ResponseWriter 控制:
-
w.WriteHeader(http.StatusCreated)显式设置状态码(默认是 200) -
w.Header().Set("Content-Type", "application/json; charset=utf-8")设置响应头 -
json.NewEncoder(w).Encode(result)安全输出 JSON(自动处理编码与错误) - 返回 HTML 时,建议用
template.ParseFiles渲染,避免字符串拼接
务必确保在调用 WriteHeader 或首次写入 w 后,不能再修改 Header —— 否则会被忽略。











