Go 中用 net/http 创建 HTTP 服务器无需第三方框架,核心是 http.ServeMux 和 Handler;支持默认多路复用器、自定义路由、方法判断、JSON 响应、参数解析及日志/恢复中间件。
在 Go 中用 net/http 创建 HTTP 服务器非常简洁,不需要第三方框架也能轻松处理路由和响应。核心在于理解 http.ServeMux(多路复用器)的作用,以及如何通过 http.HandleFunc 或自定义 http.Handler 来分发请求。
最简服务只需几行代码:
启动一个监听 8080 端口的服务器,对根路径 / 返回纯文本响应:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
})
fmt.Println("Server starting on :8080")
http.ListenAndServe(":8080", nil)
}
这里 nil 表示使用默认的 http.DefaultServeMux,它负责把请求路径映射到对应的处理函数。
显式创建 http.ServeMux 更清晰,也便于测试和复用:
示例:
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, `{"users":[]}`)
})
mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprint(w, "OK")
})
http.ListenAndServe(":8080", mux)
}
net/http 不直接按方法(GET/P
OST/PUT)自动路由,需在 handler 内判断:
mux.HandleFunc("/posts", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
// 返回文章列表
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, `[{"id":1,"title":"Go入门"}]`)
case "POST":
// 创建新文章
w.WriteHeader(http.StatusCreated)
fmt.Fprint(w, `{"id":2,"title":"新文章"}`)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
注意:确保返回正确状态码和响应头,尤其是 JSON 接口要设 Content-Type: application/json。
用 json.Marshal 序列化结构体,并设置响应头:
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
user := User{ID: 123, Name: "Alice"}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user) // 自动调用 Marshal,更安全
})
推荐用 json.NewEncoder(w).Encode() 替代 json.Marshal() + fmt.Fprint,它能流式写入、避免内存拷贝,且自动处理错误(如编码失败时写入空响应)。
查询参数(?key=value):r.URL.Query().Get("page")
路径参数(需手动解析,如 /user/123):用 strings.Split(r.URL.Path, "/") 或正则提取
表单数据(POST 表单或 x-www-form-urlencoded):r.ParseForm() 后读 r.FormValue("username")
JSON 请求体:用 io.ReadAll(r.Body) 读取原始字节,再 json.Unmarshal
示例(读取 JSON 请求体):
mux.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "POST required", http.StatusMethodNotAllowed)
return
}
var req struct {
Username string `json:"username"`
Password string `json:"password"`
}
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
// 验证逻辑...
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, `{"success":true}`)
})
通过包装 handler 实现通用逻辑:
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("→ %s %s\n", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func recoverMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
http.Error(w, "Internal error", http.StatusInternalServerError)
fmt.Printf("Panic: %v\n", err)
}
}()
next.ServeHTTP(w, r)
})
}
// 使用:
mux := http.NewServeMux()
mux.HandleFunc("/api/", apiHandler)
http.ListenAndServe(":8080", recoverMiddleware(loggingMiddleware(mux)))
注意中间件顺序:越靠外的越先执行(如日志在 recover 外层,就能记录 panic 前的请求)。
# word
# js
# json
# go
# golang
# 编码
# app
# 字节
# 端口
# usb
# ai
# switch
# 路由
# 状态码
# red
# 中间件
# 结构体
# 接口
# nil
# http
# 自定义
# 表单
# 多路
# 第三方
# 复用器
# 尤其是
# 就能
# 不需要
# 也能
# 只需
相关文章:
如何通过.red域名打造高辨识度品牌网站?
大连网站设计制作招聘信息,大连投诉网站有哪些?
建站之星2.7模板:企业网站建设与h5定制设计专题
如何规划企业建站流程的关键步骤?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何使用Golang table-driven基准测试_多组数据测量函数效率
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
网站制作企业,网站的banner和导航栏是指什么?
如何高效生成建站之星成品网站源码?
,怎么在广州志愿者网站注册?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
公司网站的制作公司,企业网站制作基本流程有哪些?
专业公司网站制作公司,用什么语言做企业网站比较好?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
高防服务器租用指南:配置选择与快速部署攻略
,怎么用自己头像做动态表情包?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站之星24小时客服电话如何获取?
济南企业网站制作公司,济南社保单位网上缴费步骤?
移民网站制作流程,怎么看加拿大移民官网?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
如何快速搭建虚拟主机网站?新手必看指南
高端云建站费用究竟需要多少预算?
如何基于云服务器快速搭建网站及云盘系统?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
建站之星如何快速更换网站模板?
高防服务器:AI智能防御DDoS攻击与数据安全保障
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何在阿里云购买域名并搭建网站?
*服务器网站为何频现安全漏洞?
如何在VPS电脑上快速搭建网站?
建站之星如何优化SEO以实现高效排名?
智能起名网站制作软件有哪些,制作logo的软件?
大连网站制作公司哪家好一点,大连买房网站哪个好?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何在阿里云服务器自主搭建网站?
php json中文编码为null的解决办法
css网站制作参考文献有哪些,易聊怎么注册?
如何快速搭建高效香港服务器网站?
威客平台建站流程解析:高效搭建教程与设计优化方案
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
导航网站建站方案与优化指南:一站式高效搭建技巧解析
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
建站VPS能否同时实现高效与安全翻墙?
*请认真填写需求信息,我们会在24小时内与您取得联系。