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

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

推荐答案

重点是s.broadcaster <- payload.Username

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

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

这意味着:

  • 当我们使用一个GoRoutine向通道发送数据时,它将被阻止,直到数据被另一个GoRoutine使用.
  • 当我们使用GoRoutine从通道接收数据时,它将被阻止,直到通道中有可用的数据.

Go相关问答推荐

将Go程序导出到WASM—构建约束排除所有Go文件

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

仅呈现一个模板的GIN Web应用程序

Golang测试容器,无法使网络正常工作

../golang/pkg/mod/github.com/wmentor/lemmas@v0.0.6/processor.go:72:9:未定义:令牌.进程

exec的可执行决议.命令+路径

go-chi: 接受带有反斜杠的 url 路径参数

Go time.Parse 无效的 ISO 日期

使用 Go 根据 /etc/shadow 文件中的散列密码验证密码

设置 graphql 的最大文件上传大小(golang)

在 .go 文件中运行一个函数和在 Go 模板中调用它有什么区别?

errors.Wrap 和 errors.WithMessage 有什么区别

使用 golang 生成 vim

关系不存在 GORM

即使一个测试用例失败,如何运行所有测试用例

Golang ACMEv2 HTTP-01 挑战不挑战服务器

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

Gin中测试模式有什么用

将函数的值作为输入参数返回给另一个

如何在 Go 中为字符串创建编写器