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