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

我很难理解我使用博客所做的事情的实现


我正在创建一个新的 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

    }

}


哆啦的时光机
浏览 108回答 1
1回答

一只萌萌小番薯

关键在于s.broadcaster <- payload.Username&nbsp;它试图从渠道获取价值。您可以在此处阅读有关频道的更多信息https://gobyexample.com/channels。通道操作(即写入或读取)本质上是阻塞的。这表示:当我们使用 GoRoutine 将数据发送到通道时,它将被阻塞,直到数据被另一个 GoRoutine 消费。当我们使用 GoRoutine 从通道接收数据时,它将被阻塞,直到数据在通道中可用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go