为了账号安全,请及时绑定邮箱和手机立即绑定

Go-处理程序中的无限循环

Go-处理程序中的无限循环

Go
哆啦的时光机 2022-11-28 17:05:34
我很难理解我使用博客所做的事情的实现我正在创建一个新的 websocket 连接,其中我正在运行一个无限循环据我了解无论 websocket 收到什么消息,无限循环都应该无限期地运行但事实并非如此,它内部的逻辑只有在从前端 ws 连接发送“新的有效负载/消息”时才会触发:func (s *SocketHandlers) NewConnectionHandler(w http.ResponseWriter, r *http.Request) {    // upgrade the http request to a ws request    ws, err := upgrader.Upgrade(w, r, nil)    if err != nil {        log.Fatal(err)    }    defer ws.Close()    for { // infinite loop        log.Println("Checking to see if this repeats") // <=== PRINTS ONLY ONCE!        var payload core.NewSessionPayload        if err := ws.ReadJSON(&payload); err != nil {            log.Println("Cannot read socket conection payload")            log.Fatal(err)        }        s.clientsMap[ws] = core.ClientNode{            Active:   true,            Username: payload.Username,        }        // broadcast the latest users list to all the users        s.broadcaster <- payload.Username    }}
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

关键在于s.broadcaster <- payload.Username 它试图从渠道获取价值。

您可以在此处阅读有关频道的更多信息https://gobyexample.com/channels

通道操作(即写入或读取)本质上是阻塞的。

这表示:

  • 当我们使用 GoRoutine 将数据发送到通道时,它将被阻塞,直到数据被另一个 GoRoutine 消费。

  • 当我们使用 GoRoutine 从通道接收数据时,它将被阻塞,直到数据在通道中可用。


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信