gpt4 book ai didi

go - 通过 websocket 使用 channel

转载 作者:IT王子 更新时间:2023-10-29 02:27:04 26 4
gpt4 key购买 nike

如果我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com