最简Go HTTP服务仅需三行代码:导入net/http、注册根路由处理器、调用ListenAndServe监听端口;注意其阻塞特性及端口占用panic问题。
用 net/http 起一个能跑通的最小服务
Go 原生 net/http 包足够轻量,不需要任何第三方依赖就能响应 HTTP 请求。最简服务只需三行代码:
package main
import "net/http"
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})
http.ListenAndServe(":8080", nil)
}
运行后访问 http://localhost:8080 即可看到响应。注意两点:一是 http.ListenAndServe 默认阻塞,后续代码不会执行;二是端口被占用时会直接 panic,错误信息是 listen tcp :8080: bind: address already in use,需手动 kill 进程或换端口。
处理 GET/POST 参数不能只靠 r.URL.Query()
r.URL.Query() 只能取 URL 查询参数(如 ?name=alice),表单提交或 JSON 请求体里的数据必须显式解析。常见误区是以为 ParseForm() 能自动处理所有类型——它只对 application/x-www-form-urlencoded 和 multipart/form-data 有效。
- GET 参数:用
r.URL.Query().Get("key") - POST 表单:先调
r.ParseForm(),再用r.FormValue("key") - JSON 请求体:用
json.NewDecoder(r.Body).Decode(&v),且记得检查r.Body是否为nil
漏掉 ParseForm() 直接读 r.FormValue 会返回空字符串;没关闭 r.Body 在高并发下可能耗尽文件描述符。
路由不够用时,别急着上 gin 或 echo
原生 http.ServeMux 支持前缀匹配和子路由注册,适合中小项目快速分组: