go - 通过 websocket 使用 channel

标签 go websocket

如果我在 main 或 func home 的任何地方使用 chan,应用程序会运行,但它实际上不起作用。没有抛出错误,但是,它不会工作。 如果我删除 channel 引用,它会恢复工作。 通过在结构中使用 chan 或全局 channel ,应用程序将停止工作。

GET 请求中,它从 func home 返回 h.Message 通过在代码中添加任何 channel ,GET 请求不会返回消息。

https://play.golang.org/p/-ZVcLhZRRRG

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/websocket"
    // _ "github.com/go-sql-driver/mysql"
)

type WMessage struct {
    Message string `json:"message"`
    ch      chan string
}

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

var Chann chan string

func (h *WMessage) home(w http.ResponseWriter, r *http.Request) {
    h.Message = "hey this is the message from home"

    fmt.Fprintln(w, h.Message)
    fmt.Println(<-h.ch)
}

func main() {
    hom := &WMessage{}

    hom.ch = make(chan string)

    hom.ch <- "message sent"

    http.HandleFunc("/", hom.home)
    err := http.ListenAndServe(":3000", nil)
    if err != nil {
        fmt.Println("there was an error -> ", err)
    }
}

最佳答案

无缓冲 channel 本质上是阻塞的,即写入 channel (hom.ch <- "message sent") 和从 channel 读取 (fmt.Println(<-h.ch)) 会阻塞 go-routine。

在你的例子中,http服务器未运行,因为 hom.ch <- "message sent"阻止执行。这就是为什么 GET请求无效。

一个简单的解决方案是改为使用缓冲 channel 。

关于go - 通过 websocket 使用 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699457/

相关文章:

go - 检查函数是否作为 goroutine 被调用

go - 使用 fyne.io 捕获键盘按下事件

php - 如何将用户添加到 websocket 聊天中

WebSocket - 有效负载长度

package - 如何在 Go 中使用与包同名的变量名?

go - 访问结构中嵌入 slice 的值

go - 如何在 vscode 中的 golang lint 工具中忽略文件或路径

HTML5 : Latest WebSockets

javascript - 如何使用 xterm.js 向 AWS session 管理器 websocket url 发送命令?

c# - html5和C#之间的web socket通信