Go写SSE handler需设Content-Type和Cache-Control头、逐行写data:并双换行、每次调Flush须禁用Read/WriteTimeout、设IdleTimeout用chansync.Map实现安全广播监听r.Context().Done()防泄漏。Go怎么写一个能发SSE的HTTP handlerGo原生不带SSE专用类型但用标准http.ResponseWriter和http.Request就能搞定关键在响应头和流式写入方式。常见错误是直接用fmt.Fprintf往ResponseWriter里写结果被缓冲、没实时推送或者忘了设Content-Type: text/event-stream浏览器根本不认。必须调用w.Header().Set(Content-Type, text/event-stream)必须调用w.Header().Set(Cache-Control, no-cache)否则某些代理或浏览器会缓存整个流每次写完一条事件后必须调用w.(http.Flusher).Flush()——这是实时推送的核心ResponseWriter默认不自动刷缓冲不要用json.Marshal后一次性w.Write要按SSE格式逐行写data: ...每条消息以双换行结束为什么net/http的handler容易断连SSE依赖长连接而Go的http.Server默认有超时控制客户端一静默几十秒就可能被关掉连接表现为前端突然收不到新事件。这不是代码bug是服务端配置问题。默认ReadTimeout和WriteTimeout都只设了几分钟但SSE要求连接维持更久甚至几小时且期间可能完全无数据。立即学习“go语言免费学习笔记深入”必须显式禁用ReadTimeout和WriteTimeout改用ReadHeaderTimeout只限制请求头读取时间推荐设置IdleTimeout为0不限制空闲时间或设为较大值如5 * time.Minute如果用了反向代理如Nginx它也有自己的超时配置proxy_read_timeout必须同步调大否则它先断怎么安全地向多个客户端广播事件不能每个请求都起goroutine去轮询、再挨个Write——这会迅速耗尽连接和内存。得用发布-订阅模型让handler只负责监听频道、转发不参与业务逻辑。 WisPaper 复旦大学研发的AI学术搜索工具5分钟内筛选1000篇论文