最简HTTP服务用http.ListenAndServe(":8080", nil),注册路由优先选http.HandleFunc;HTTPS需用ListenAndServeTLS并提供证书;生产环境应显式创建http.Server以支持超时控制和优雅关机。

用 net/http 启动最简服务
Go 内置的 net/http 包足够直接跑起一个可用的 HTTP 服务,不需要额外依赖。核心就是调用 http.ListenAndServe,传入监听地址和处理器。
- 监听地址格式必须是
"host:port",比如":8080"(空 host 表示监听所有接口);写成"8080"会报错listen tcp: address 8080: missing port in address - 处理器可以是
nil,此时使用默认的http.DefaultServeMux;也可以传自定义的http.Handler实例 - 该函数会阻塞,且只在发生错误时返回;常见错误如端口被占用会返回
listen tcp :8080: bind: address already in use
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
})
http.ListenAndServe(":8080", nil)
}
注册路由用 http.HandleFunc 还是 http.Handle?
两者都注册到默认多路复用器,区别在于参数类型和灵活性:
-
http.HandleFunc(pattern, handlerFunc):第二个参数是func(http.ResponseWriter, *http.Request),写起来更简洁 -
http.Handle(pattern, handler):第二个参数必须是实现了http.Handler接口的类型(含ServeHTTP方法),适合封装逻辑或复用中间件 - 注意路由匹配是前缀匹配,
"/api"会匹配"/api/users"和"/api",但不会自动区分末尾斜杠;若需精确匹配,得自己在 handler 里判断r.URL.Path
如何让服务支持 HTTPS?
用 http.ListenAndServeTLS 替代 ListenAndServe,它要求提供 TLS 证书文件路径:
- 第一个参数仍是地址,如
":443" - 第二、三个参数分别是证书文件(
cert.pem)和私钥文件(key.pem)路径;路径必须可读,否则报错open cert.pem: no such file or directory - 若用自签名证书,浏览器会提示不安全;生产环境建议用 Let’s Encrypt 等签发的证书
- 不支持仅 HTTPS —— 若同时要 HTTP 和 HTTPS,需启动两个独立的
http.Server实例,分别绑定不同端口和配置
err := http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)
if err != nil {
panic(err)
}
为什么推荐显式创建 http.Server 实例?
直接调用 http.ListenAndServe 看似简单,但缺少对超时、连接生命周期、优雅关闭等关键控制。显式构造 http.Server 是生产环境的标准做法:
立即学习“go语言免费学习笔记(深入)”;
-
ReadTimeout和WriteTimeout防止慢请求拖垮服务(注意:Go 1.8+ 推荐用ReadHeaderTimeout和IdleTimeout更精细) - 配合
context.Context可实现优雅关机:调用srv.Shutdown(ctx)会等待活跃连接完成再退出 - 能单独设置
Handler、Addr、TLS 配置等,便于测试和复用 - 日志、中间件、跨域(CORS)等扩展也更容易注入到自定义
Handler链中
很多线上崩溃不是因为业务逻辑错,而是没设超时或没做关机等待,导致 SIGTERM 后连接被粗暴中断。










