Golang使用net/http处理HTTP请求
发布时间 - 2026-01-09 00:00:00 点击率:次最常见原因是没启动服务器或 ListenAndServe 后程序退出;注册路由仅存入 DefaultServeMux,需调用 ListenAndServe 才生效,且须确保其为 main goroutine 最后调用。
为什么 http.HandleFunc 注册的路由不生效?
最常见原因是没启动服务器,或 http.ListenAndServe 调用后程序直接退出。注册路由只是往默认的 http.DefaultServeMux 里塞函数,真正监听和分发要靠 Listen 启动。
AndServe
- 确保调用
http.ListenAndServe(":8080", nil),第二个参数为nil表示使用默认多路复用器 - 如果用了自定义
http.ServeMux,必须显式传入ListenAndServe第二个参数,不能传nil - 检查端口是否被占用,错误日志会输出
listen tcp :8080: bind: address already in use - Go 程序在
ListenAndServe后不会自动阻塞——如果它不是 main goroutine 的最后调用,后续代码执行完进程就退出了
如何读取 URL 查询参数和表单数据?
req.URL.Query() 拿查询参数(?name=alice&age=30),req.ParseForm() 才能读 POST 的 application/x-www-form-urlencoded 或 multipart/form-data 数据。两者互不影响,但顺序有讲究。
- 对 GET 请求,直接用
req.URL.Query().Get("key") - 对 POST 表单,先调
req.ParseForm()(否则req.Form是空的),再用req.FormValue("key") -
ParseForm()会自动识别Content-Type并解析;若请求体是 JSON,则不应调用它,而该用json.Decoder - 重复键(如
?tag=a&tag=b)用req.URL.Query()["tag"]获取切片,Get只返回第一个
怎么正确处理 JSON 请求和响应?
别手动拼接字符串或用 fmt.Fprintf 输出 JSON——容易出格式错误、缺少 Content-Type、不处理编码问题。
- 写响应:设头
w.Header().Set("Content-Type", "application/json; charset=utf-8"),再用json.NewEncoder(w).Encode(v) - 读请求:用
json.NewDecoder(req.Body).Decode(&v),别用io.ReadAll+json.Unmarshal,除非你明确需要原始字节 - 注意
req.Body只能读一次;如果之前调过ParseForm()或ParseMultipartForm(),Body可能已被消费,需提前保存或重置 - 错误时也应返回 JSON 响应(如
{"error": "invalid json"}),并设http.StatusBadRequest
func handleUser(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
if r.Method != "POST" {
http.Error(w, `{"error":"method not allowed"}`, http.StatusMethodNotAllowed)
return
}
var u struct{ Name string `json:"name"` }
if err := json.NewDecoder(r.Body).Decode(&u); err != nil {
http.Error(w, `{"error":"invalid json"}`, http.StatusBadRequest)
return
}
json.NewEncoder(w).Encode(map[string]string{"msg": "ok", "name": u.Name})
}
为什么并发请求下状态变量会错乱?
Go 的 HTTP handler 函数每次请求都在独立 goroutine 中执行,但闭包捕获的外部变量(比如全局 map、计数器)是共享的,没有自动同步机制。
- 避免在 handler 中直接读写全局可变变量;如需共享状态,用
sync.Mutex或sync.RWMutex保护 - 更推荐把状态封装进结构体,用
http.Handle注册带状态的 handler 实例,而非HandleFunc - 不要在 handler 里启 goroutine 后不等它结束就返回——响应已写出,但后台 goroutine 还在跑,可能访问已释放的局部变量
- 日志打印也要注意:
log.Printf是线程安全的,但自定义 logger 若含缓存或写文件逻辑,仍需确认并发安全性
req.Body 的一次性读取、ParseForm 的隐式副作用、以及没加锁的共享变量,最容易在线上突然暴露。
# js
# json
# go
# golang
# 处理器
# 编码
# app
# 字节
# 端口
# usb
# ai
# 路由
# 并发请求
# 同步机制
# 为什么
# 封装
# Error
# printf
# 局部变量
# 字符串
# 结构体
# 线程
# 闭包
# 切片
# nil
# map
# 并发
# http
# 第二个
# 自定义
# 再用
# 表单
# 最常见
# 装进
# 出了
# 都在
# 第一个
# 还在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
北京专业网站制作设计师招聘,北京白云观官方网站?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Python文件异常处理策略_健壮性说明【指导】
如何在云指建站中生成FTP站点?
如何续费美橙建站之星域名及服务?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
如何在自有机房高效搭建专业网站?
如何注册花生壳免费域名并搭建个人网站?
如何快速完成中国万网建站详细流程?
独立制作一个网站多少钱,建立网站需要花多少钱?
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
bootstrap日历插件datetimepicker使用方法
用v-html解决Vue.js渲染中html标签不被解析的问题
如何快速搭建个人网站并优化SEO?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
公司门户网站制作流程,华为官网怎么做?
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
香港服务器选型指南:免备案配置与高效建站方案解析
开心动漫网站制作软件下载,十分开心动画为何停播?
高防服务器租用如何选择配置与防御等级?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
微信小程序 input输入框控件详解及实例(多种示例)
canvas 画布在主流浏览器中的尺寸限制详细介绍
奇安信“盘古石”团队突破 iOS 26.1 提权
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel如何优化应用性能?(缓存和优化命令)
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
如何撰写建站申请书?关键要点有哪些?
微信小程序 require机制详解及实例代码
如何用IIS7快速搭建并优化网站站点?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Java类加载基本过程详细介绍
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
网站图片在线制作软件,怎么在图片上做链接?
如何快速上传自定义模板至建站之星?
下一篇:steam余额怎么转到蒸汽平台
下一篇:steam余额怎么转到蒸汽平台

