Go- infinite for loop in a handler

huangapple go评论79阅读模式
英文:

Go- infinite for loop in a handler

问题

我正在使用一个博客来理解我所做的某个实现,但遇到了困难。

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

根据我的理解:

  • 无限循环应该无限运行,而不管 WebSocket 收到的消息是什么。

但事实并非如此,只有在从前端 WebSocket 连接发送一个"新的负载/消息"时,其中的逻辑才会被触发:

func (s *SocketHandlers) NewConnectionHandler(w http.ResponseWriter, r *http.Request) {
	// 将 HTTP 请求升级为 WebSocket 请求
	ws, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer ws.Close()
	for { // 无限循环
		log.Println("Checking to see if this repeats") // <=== 仅打印一次!
		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,
		}
		// 将最新的用户列表广播给所有用户
		s.broadcaster <- payload.Username
	}
}

请注意,我只翻译了代码部分,其他内容不包括在内。

英文:

I am having difficulty understanding the implementation of something that I did using a blog

I am creating a new websocket connection, in which, I am running an infinite loop

As per my understanding

  • The infinite loop should run indefinitely regardless the message received by the websocket

But it doesn't, the logic inside it is only triggered when a "new payload/message" is sent from the frontend ws connection:

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(&quot;Checking to see if this repeats&quot;) // &lt;=== PRINTS ONLY ONCE!
		var payload core.NewSessionPayload
		if err := ws.ReadJSON(&amp;payload); err != nil {
			log.Println(&quot;Cannot read socket conection payload&quot;)
			log.Fatal(err)
		}
		s.clientsMap[ws] = core.ClientNode{
			Active:   true,
			Username: payload.Username,
		}
		// broadcast the latest users list to all the users
		s.broadcaster &lt;- payload.Username
	}
}

答案1

得分: 0

重要提示:我将为您提供翻译服务,但请注意,我不能执行您的第一个要求,即只返回翻译好的部分。我将尽力提供准确的翻译,但可能会包含一些额外的信息。以下是您要翻译的内容:

关键点在于这里的代码s.broadcaster <- payload.Username,它试图从一个通道中获取一个值。

您可以在这里阅读更多关于通道的信息:https://gobyexample.com/channels。

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

这意味着:

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

the point is here s.broadcaster &lt;- payload.Username
it's trying to get a value from a channel.

you can read more about channels here https://gobyexample.com/channels.

Channel operations (i.e. write or read) are blocking in nature.

This means:

  • When we send data into the channel using a GoRoutine, it will be blocked until the data is consumed by another GoRoutine.
  • When we receive data from a channel using a GoRoutine, it will be blocked until the data is available in the channel.

huangapple
  • 本文由 发表于 2022年4月12日 17:07:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/71839919.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定