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

Go- infinite for loop in a handler

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

我正在创建一个新的 websocket 连接,我在其中 运行 进行了一个无限循环

据我了解

但它不是,它里面的逻辑只有在从前端ws连接发送“新payload/message”时才会触发:

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
    }
}

重点在这里s.broadcaster <- payload.Username 它正在尝试从通道获取值。

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

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

这意味着:

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