Go-处理程序中的无限循环
Go- infinite for loop in a handler
我很难理解我使用博客所做的事情的实现
我正在创建一个新的 websocket 连接,我在其中 运行 进行了一个无限循环
据我了解
- 无论 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 从通道接收数据时,它将被阻塞,直到数据在通道中可用。
我很难理解我使用博客所做的事情的实现
我正在创建一个新的 websocket 连接,我在其中 运行 进行了一个无限循环
据我了解
- 无论 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 从通道接收数据时,它将被阻塞,直到数据在通道中可用。