SSE 能否跑通取决于 Go 代码逻辑、响应头设置、Flush() 调用、goroutine 管理及反向代理配置;Content-Type 必须为 text/event-stream(无 charset),Cache-Control: no-cache 不可缺失,所有 header 必须在首次 Write 前设置,每次写事件后需显式 Flush(),每连接需独立 goroutine + channel,并监听 r.Context().Done() 清理资源,Nginx 需禁用缓冲并调大超时。

GoLand 本身不提供 SSE 专用配置,它只是 IDE;真正决定 SSE 能否跑通的是 Go 代码逻辑、HTTP 响应头、刷新行为和连接生命周期管理——配置错一个点,客户端就收不到事件或连不上。
Content-Type 和缓存头必须在 Write 前设好
GoLand 不会帮你校验响应头是否设置正确,但浏览器看到缺失 Content-Type: text/event-stream 或 Cache-Control: no-cache 就永远卡在 connecting 状态。
-
Content-Type必须是text/event-stream,不能带charset(如text/event-stream; charset=utf-8在 Safari 和部分 Chrome 版本中直接失败) -
Cache-Control: no-cache缺失时,Nginx 或 Cloudflare 可能缓存初始响应,后续事件全被拦截 - 所有
w.Header().Set()调用必须在第一次fmt.Fprintf(w, ...)之前,否则 Go 的net/http会拒绝修改 header
每次写 data: 后必须显式调用 Flush()
GoLand 的调试器能看到 fmt.Fprintf 执行成功,但数据仍卡在缓冲区——因为 http.ResponseWriter 默认用 bufio.Writer 包裹,不 Flush() 就不会发到 TCP 层。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 错误写法:
defer w.(http.Flusher).Flush()—— 只在 handler 返回时刷一次,客户端收不到流式数据 - 正确做法:每次写完
data: ...\n\n后立刻断言并调用:if f, ok := w.(http.Flusher); ok { f.Flush() } - 漏掉
\n\n或多写一个\r(比如\r\n\r\n),EventSource 会静默丢弃整条事件
每个连接必须配独立 goroutine + channel
GoLand 的 profiler 能看到 goroutine 数暴涨,但不会告诉你原因——90% 是因为多个事件并发往同一个 http.ResponseWriter 写,触发 panic 或数据错乱。
- 切勿在 handler 主 goroutine 中循环
time.Sleep或阻塞读取,会拖垮整个 HTTP server - 每个客户端连接启动一个 goroutine:
go func(w http.ResponseWriter, r *http.Request) { ... }(w, r) - 用带缓冲的
chan string(如make(chan string, 16))接收业务消息,防止生产者阻塞 - 必须监听
r.Context().Done(),客户端关闭页面后及时close(ch)并退出 goroutine,否则 goroutine 泄漏
反向代理和超时配置常被忽略
本地用 GoLand 运行 go run main.go 能收到事件,但部署到 Nginx 后断连频繁——问题不在 Go 代码,而在中间件。
- Go HTTP server 需禁用超时:
http.Server{ReadTimeout: 0, WriteTimeout: 0},否则空闲 30 秒自动断开 - Nginx 必须配
proxy_read_timeout 300;和proxy_buffering off;,否则它自己先断连 - 加心跳:每 25 秒写一条
: ping\n\n(冒号开头的注释行,客户端忽略但能保活) - 别在 SSE handler 里打
log.Printf—— 日志 I/O 可能阻塞Flush(),导致客户端卡住
最易被忽略的其实是连接关闭检测:你以为 flush 成功就万事大吉,但客户端网络闪断后,w.Write() 可能仍返回 nil,直到下一次 flush 才报错。得靠 r.Context().Done() 或定期 write 检查才能真正清理资源。

















