Golang如何创建HTTP服务器_Golang net/http使用详解
发布时间 - 2026-02-02 00:00:00 点击率:次使用 http.ListenAndServe 启动服务器时需手动 recover panic,优先用自定义 ServeMux 替代 DefaultServeMux,读取请求体前设 context 超时,上传限流用 MaxBytesReader,返回 JSON 必须显式设置 Content-Type。
用 http.ListenAndServe 启动最简服务器,但默认不处理 panic
直接调用 http.ListenAndServe(":8080", nil) 就能跑起一个 HTTP 服务,nil 表示使用默认的 http.DefaultServeMux。但要注意:如果 handler 函数里发生 panic,整个服务器会崩溃退出,没有任何恢复机制。生产环境必须自己包装 handler,用 recover() 捕获异常。
注册路由别只靠 http.HandleFunc,优先用自定义 http.ServeMux
http.HandleFunc 看似方便,但它往全局的 DefaultServeMux 注册,多个包之间容易冲突,也不利于测试和隔离。更可控的方式是显式创建 mux:
mux := http.NewServeMux()
mux.HandleFunc("/api/users", usersHandler)
mux.HandleFunc("/health", healthHandler)
http.ListenAndServe(":8080", mux)
- 每个服务实例可拥有独立 mux,避免隐式共享
- 便于在测试中传入 mock mux 或替换 handler
- 支持嵌套路由前缀:
http.StripPrefix("/v1", mux)
处理请求体前务必设超时,否则 req.Body.Read 可能永久阻塞
HTTP 请求体(尤其是 POST/PUT)读取没有内置超时,客户端若只发 header 不发 body,req.Body.Read 会一直等下去。正确做法是在读取前设置上下文超时:
ctx, cancel :=context.WithTimeout(r.Context(), 5*time.Second) defer cancel() r = r.WithContext(ctx) body, err := io.ReadAll(r.Body) if err != nil { // 可能是 context.DeadlineExceeded }
- 不要依赖
http.Server.ReadTimeout(已弃用),它只管连接建立阶段 -
http.Server.ReadHeaderTimeout和http.Server.IdleTimeout才是现代替代项 - 上传大文件时,建议配合
http.MaxBytesReader限流
返回 JSON 别忘了设 Content-Type: application/json
很多人只写 json.NewEncoder(w).Encode(data),但浏览器或前端 SDK 可能因缺失 Content-Type 头而解析失败。必须手动设置:
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
- 如果用了
http.Error,它不会自动设 Content-Type,错误响应也要自己补 - 对非 UTF-8 字符(比如 GBK),需显式声明 charset;纯 ASCII 场景可省略 charset 部分
- 中间件里统一设置 header 更安全,避免每个 handler 都重复写
net/http 接口看似简单,但超时控制、panic 恢复、header 设置这些点,一旦漏掉就容易在线上出隐蔽问题。尤其在微服务间调用或公网暴露时,每个 handler 的健壮性都得单独验证。
# js
# 前端
# json
# go
# golang
# 浏览器
# app
# 路由
# 中间件
# Error
# 接口
# nil
# ASCII
# http
# 自定义
# 上传
# 也不
# 是在
# 尤其是
# 就能
# 多个
# 才是
# 也要
# 没有任何
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在阿里云域名上完成建站全流程?
网页设计与网站制作内容,怎样注册网站?
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel如何与Pusher实现实时通信?(WebSocket示例)
如何用免费手机建站系统零基础打造专业网站?
,交易猫的商品怎么发布到网站上去?
js实现获取鼠标当前的位置
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
高防服务器如何保障网站安全无虞?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
高端建站如何打造兼具美学与转化的品牌官网?
Laravel如何创建自定义中间件?(Middleware代码示例)
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
昵图网官方站入口 昵图网素材图库官网入口
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Android仿QQ列表左滑删除操作
Laravel怎么调用外部API_Laravel Http Client客户端使用
javascript中闭包概念与用法深入理解
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
教你用AI润色文章,让你的文字表达更专业
Laravel如何使用Vite进行前端资源打包?(配置示例)
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
微信小程序 HTTPS报错整理常见问题及解决方案
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
个人摄影网站制作流程,摄影爱好者都去什么网站?
大连 网站制作,大连天途有线官网?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何打造高效商业网站?建站目的决定转化率
bing浏览器学术搜索入口_bing学术文献检索地址
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Java垃圾回收器的方法和原理总结
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
在线制作视频网站免费,都有哪些好的动漫网站?
如何撰写建站申请书?关键要点有哪些?


