0

0

Go新手如何做一个HTTP服务_Go Web项目入门实践

P粉602998670

P粉602998670

发布时间:2026-01-17 16:17:36

|

816人浏览过

|

来源于php中文网

原创

最简 HTTP 服务需用 net/http 启动并必须检查 http.ListenAndServe 错误;监听地址应写为 ":8080";路由可用 http.ServeMux;处理 JSON 时直接解码 r.Body 且只读一次;热重载推荐 air 工具。

go新手如何做一个http服务_go web项目入门实践

用 net/http 启一个最简 HTTP 服务

Go 自带 net/http 包,不用装第三方库就能跑起一个可访问的 HTTP 服务。关键不是“怎么写”,而是“别漏掉 http.ListenAndServe 的错误处理”——很多人本地跑起来没报错,部署后服务静默退出,就是这里没检查返回值。

常见错误现象:go run main.go 看似运行了,但 curl localhost:8080 返回 connection refused;或者程序启动后立刻退出,终端没任何提示。

  • http.ListenAndServe端口被占用或权限不足时会直接返回 error,**不会 panic**,必须显式判断
  • 监听地址建议写成 ":8080"(冒号开头),而非 "localhost:8080",后者在某些容器或远程环境可能绑定失败
  • 如果想复用已关闭的端口,加一行 http.Server{Addr: ":8080", ...}.ListenAndServe() 并设置 ReusePort: true(需 Go 1.19+)
package main

import ( "fmt" "log" "net/http" )

func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello, Go Web!") })

log.Println("Server starting on :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
    log.Fatal(err) // ← 这行不能省
}

}

路由不够用?别急着换 Gin,先试试 http.ServeMux

新手常以为“没路由就用框架”,其实 http.ServeMux 已经支持前缀匹配、子路径注册和基本的 404 控制。Gin 的优势在中间件、结构化参数解析、性能优化,不是“有没有路由”。过早引入框架反而掩盖了 Go HTTP 模型的本质。

使用场景:API 分组(如 /api/v1/users)、静态文件托管、健康检查端点(/healthz)。

  • http.Handlehttp.HandleFunc 底层都用默认的 http.DefaultServeMux,但自定义 http.ServeMux 更利于测试和隔离
  • 注册路径以 / 结尾(如 /static/)会自动匹配子路径;不加斜杠(如 /api)只精确匹配
  • 404 不是自动返回的——如果请求路径没匹配到任何 handler,DefaultServeMux 才返回 404;自定义 mux 需手动设置 mux.NotFoundHandler
package main

import ( "fmt" "log" "net/http" )

func main() { mux := http.NewServeMux()

mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprint(w, "ok")
})

mux.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "API path: %s", r.URL.Path)
})

// 手动控制 404
mux.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    http.Error(w, "not found", http.StatusNotFound)
})

log.Println("Server starting on :8080")
if err := http.ListenAndServe(":8080", mux); err != nil {
    log.Fatal(err)
}

}

接收 JSON 请求体时,为什么 r.Body 总是空的?

不是代码写错了,大概率是没调用 r.ParseForm() 或没读取 r.Body。Go 的 http.Request 不会自动解析 body 内容——它把原始字节流交给你自己处理,这是设计选择,不是 bug。

医真AI+开放平台
医真AI+开放平台

医真AI+ 医学AI开放平台

下载

常见错误现象:打印 r.FormValue("key") 为空;json.NewDecoder(r.Body).Decode(&v)EOFinvalid character;Postman 发 JSON,服务端收不到字段。

  • 如果 Content-Type 是 application/json,直接读 r.Body,**不要调用 r.ParseForm()**(它只处理 application/x-www-form-urlencodedmultipart/form-data
  • r.Bodyio.ReadCloser,只能读一次;后续再读会得到空内容,必要时用 io.ReadAll 先缓存
  • 记得设响应头:w.Header().Set("Content-Type", "application/json; charset=utf-8"),否则前端可能解析失败
package main

import ( "encoding/json" "log" "net/http" )

type User struct { Name string json:"name" Email string json:"email" }

func createUser(w http.ResponseWriter, r *http.Request) { var u User if err := json.NewDecoder(r.Body).Decode(&u); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return }

w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(map[string]string{
    "message": "created",
    "name":    u.Name,
})

}

func main() { http.HandleFunc("/api/user", createUser) log.Println("Server starting on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }

开发阶段热重载怎么做?别碰 go install -buildmode=plugin

Go 官方不支持运行时重载代码,所谓“热更新”本质都是进程级重启。新手容易被各种插件、构建脚本绕晕,结果本地调试时改一行代码要等 5 秒,还以为是 Go 慢。

真正轻量、稳定、无依赖的做法只有两个:

  • air:安装简单(curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin),配置一个 .air.toml 就能监听 .go 文件变化并重启
  • 用 Makefile + inotifywait(Linux/macOS)或 fswatch(macOS):比写 shell 脚本更可控,适合后期接入 CI
  • 绝对避免 go:generateplugin 做热重载——它们有平台限制、符号冲突风险,且无法 reload 全局变量和 init 函数

复杂点在于:HTTP 服务器 shutdown 需要优雅等待(比如正在处理的请求完成),否则并发请求可能被中断。用 http.Server.Shutdown 配合 context 是标准解法,但 air 默认不支持,得自己写 wrapper。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

436

2023.10.13

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

426

2023.06.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

40

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号