Golang WebSocket广播核心是channel消息中枢与goroutine并发分发,需确保读写分离、连接安全、异常清理;用sync.RWMutex保护clients map,设WriteDeadline防慢连接,recover捕获写错并清理连接。
在Golang中实现WebSocket广播,核心是用channel做消息中枢、用goroutine做并发分发,避免阻塞主线程。关键不在“写多少代码”,而在于读写分离、连接安全、异常清理这三点是否到位。
声明一个全局的broadcast channel,类型为chan []byte或自定义消息结构体,所有客户端发来的消息都先投递到这里。同时维护一个并发安全的客户端集合:
map[*websocket.Conn]bool记录活跃连接sync.RWMutex保
护读写,注册/注销时加写锁,广播遍历时加读锁sync.Mutex——读多写少场景下RWMutex能显著提升吞吐服务启动时就go handleBroadcast(),让它持续监听broadcast channel:
conn.WriteMessage(websocket.TextMessage, msg)
conn.SetWriteDeadline(time.Now().Add(5 * time.Second)),防止慢连接拖垮整个广播新连接升级成功后,立即启动两个goroutine:
conn.ReadMessage(),把原始消息(或解析后的结构体)推入broadcast channelsend chan []byte,由该协程消费并写出unregister channel发信号,或直接加锁删除map条目浏览器端只需几行JavaScript:
const ws = new WebSocket("ws://localhost:8000/ws")ws.onmessage = e => console.log("收到:", e.data)ws.send("你好") 即可触发后端广播onerror和onclose处理断连重试逻辑基本上就这些。不复杂但容易忽略write deadline、panic恢复和map清理——这三个点没做好,上线后扛不住几十个并发就会卡死或内存暴涨。