使用带有websocket的通道

And*_*ndy 0 go websocket

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

在一个GET请求时,它返回h.Messagefunc home 由代码添加任何频道,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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Muk*_*rma 5

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

在您的情况下,http服务器未运行,因为hom.ch <- "message sent"阻止执行.这就是GET请求无效的原因.

一个简单的解决方案是使其成为缓冲通道.