You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang WebSocket配对逻辑:为何第二个连接触发chat函数?

为什么第二个客户端加入时chat函数会执行

先明确两个关键前提:

  • partner是无缓冲通道:无缓冲通道的发送和接收操作必须配对完成,一方发送会阻塞直到有另一方接收,反之亦然。
  • 每个客户端连接后,都会启动独立goroutine执行match函数。

接下来拆解两个客户端连接的全过程:

  1. 第一个客户端连接
    进入match函数后,先打印Waiting for a partner...,随后进入select语句:

    • 尝试执行case partner <- c:此时没有其他goroutine在接收partner通道的数据,这个发送操作会阻塞,当前goroutine停在这里等待。
    • case p := <-partner:通道内无数据,该分支不会触发。
  2. 第二个客户端连接
    同样进入match函数,打印等待信息后进入select:

    • 此时第一个客户端的goroutine正阻塞在partner <- c的发送操作上,当第二个客户端尝试case p := <-partner时,两个操作会配对完成:第一个客户端的发送操作成功(解除阻塞),第二个客户端则从通道拿到第一个客户端的连接p。
    • 配对完成后,第二个客户端的select会执行chat(p, c),将两个客户端的连接传入chat函数,聊天逻辑正式启动。

简单来说:无缓冲通道的特性让两个客户端的goroutine在select里完成了"对接",第二个客户端的接收操作直接触发了chat函数的执行,同时也解除了第一个客户端的阻塞状态。

内容的提问来源于stack exchange,提问作者Matt Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:22:20