Golang net/http标准库怎么用_Golang HTTP开发入门
发布时间 - 2026-01-29 00:00:00 点击率:次最简HTTP服务用http.ListenAndServe(":8080", nil),默认使用http.DefaultServeMux;需自定义路由时应创建http.ServeMux实例并显式传入server.Handler,注意其仅支持前缀匹配且同路径后注册覆盖前注册。
Go 的 net/http 标准库足够轻量、稳定,直接用它写生产级 HTTP 服务完全可行,不需要立刻上框架。
怎么快速启动一个 HTTP 服务
最简方式是调用 http.ListenAndServe,传入监听地址和处理器。默认使用 http.DefaultServeMux,也就是全局的多路复用器。
常见写法:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
})
http.ListenAndServe(":8080", nil) // nil 表示用默认多路复用器
}
注意:http.ListenAndServe 默认启用 HTTP/1.1,不支持 HTTPS(需用 http.ListenAndServeTLS);端口被占用时会直接 panic,建议加错误处理。
- 监听地址写
":8080"表示绑定所有网卡,写"127.0.0.1:8080"更安全(仅本地访问) - 如果处理器逻辑稍复杂,别把业务逻辑全塞进匿名函数里,应拆成独立函数,便于测试和复用
-
nil作为第二个参数虽方便,但隐藏了路由控制权——后续想换多路复用器或加中间件时,得改这里
如何自定义路由和处理器
直接操作 http.ServeMux 实例,能明确控制路由注册行为,也利于单元测试(比如传入 mock 的 *http.ServeMux)。
示例:
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api/users", usersHandler)
mux.HandleFunc("/health", healthHandler)
server := &http.Server{
Addr: ":8080",
Handler: mux,
}
server.ListenAndServe()
}
关键点:
-
http.ServeMux只支持前缀匹配(/api会匹配/api/users和/api/foo/bar),不支持通配符或正则——需要路径参数或 REST 风格路由时,得自己解析r.URL.Path或换第三方路由器(如gorilla/mux、chi) - 处理器函数签名必须是
func(http.ResponseWriter, *http.Request),否则编译报错:cannot use ... (type func()) as type func(http.ResponseWriter, *http.Request) in argument to mux.HandleFunc - 多个
HandleFunc注册相同路径,后注册的会覆盖前一个,无警告
怎么读取请求参数和解析 JSON
GET 查询参数用 r.URL.Query().Get("key"),POST 表单用 r.FormValue("key")(自动调用 ParseForm),JSON 请求体需手动解码。
典型 JSON 处理片段:
func apiPostHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed
)
return
}
var data struct {
Name string `json:"name"`
Age int `json:"age"`
}
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
}
容易踩的坑:
-
r.Body是io.ReadCloser,只可读一次;若中间件已读过(如日志中间件调用了r.ParseForm()或io.ReadAll(r.Body)),后续再读就会得到空内容 - 没设
Content-Type: application/json头时,json.Decode仍可能成功(只要内容合法),但前端发错类型时服务端难以区分意图 -
http.Error会立即写响应并返回,但不会终止 handler 函数执行——后面代码仍会运行,可能导致重复写响应(触发http: multiple response.WriteHeader calls错误)
怎么安全关闭 HTTP 服务
http.Server.Shutdown 是唯一推荐的优雅关机方式,它会等待活跃连接完成处理后再退出。直接杀进程或用 server.Close() 会导致正在处理的请求被中断。
示例:
server := &http.Server{Addr: ":8080", Handler: mux}
go func() {
if err := server.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err)
}
}()
// 收到 SIGINT/SIGTERM 后触发关机
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
server.Shutdown(ctx)
注意点:
-
Shutdown不会关闭监听 socket 直到所有连接完成,超时时间要结合业务响应时长设(例如有长轮询或流式接口,就得设更长) - 若 handler 中有阻塞操作(如未设超时的数据库查询、外部 HTTP 调用),需在对应上下文中传入取消信号,否则
Shutdown会等满超时时间 - 标准库不提供内置的请求超时控制,需在
http.Server中配置ReadTimeout、WriteTimeout或用context手动控制 handler 内部逻辑
真正难的不是写出能跑的 HTTP 服务,而是让每个 handler 在高并发下不泄露 goroutine、不阻塞主线程、不忽略错误返回、不滥用全局状态——这些细节不会出现在入门示例里,但线上出问题时,往往就卡在这几步。
# js
# 前端
# json
# go
# golang
# 处理器
# app
# 路由器
# 端口
# usb
# ai
# 路由
# 标准库
# 中间件
# Error
# 接口
# 线程
# 主线程
# nil
# 并发
# 数据库
# http
# https
# 多路
# 自定义
# 不支持
# 复用器
# 或用
# 就会
# 多个
# 不需要
# 出现在
# 中有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
如何实现建站之星域名转发设置?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
如何获取PHP WAP自助建站系统源码?
Laravel如何自定义错误页面(404, 500)?(代码示例)
php json中文编码为null的解决办法
千库网官网入口推荐 千库网设计创意平台入口
如何快速搭建虚拟主机网站?新手必看指南
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
C#如何调用原生C++ COM对象详解
微信公众帐号开发教程之图文消息全攻略
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
如何快速搭建高效可靠的建站解决方案?
如何快速搭建二级域名独立网站?
青岛网站建设如何选择本地服务器?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
JavaScript如何实现倒计时_时间函数如何精确控制
如何做网站制作流程,*游戏网站怎么搭建?
Android 常见的图片加载框架详细介绍
免费网站制作appp,免费制作app哪个平台好?
利用vue写todolist单页应用
如何在万网开始建站?分步指南解析
黑客入侵网站服务器的常见手法有哪些?
Android中AutoCompleteTextView自动提示
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
实例解析Array和String方法
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
bing浏览器学术搜索入口_bing学术文献检索地址
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
如何快速搭建FTP站点实现文件共享?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Bootstrap CSS布局之列表
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
如何用西部建站助手快速创建专业网站?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
LinuxCD持续部署教程_自动发布与回滚机制
php 三元运算符实例详细介绍
如何快速完成中国万网建站详细流程?
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置


