如果我在main或func home上的任何地方使用chan,应用程序会运行,但它并不真正起作用.没有错误抛出,但是,它不起作用.如果删除通道引用,它将恢复工作.通过在结构或全局通道中使用chan,应用程序停止工作.
在一个GET请求时,它返回h.Message从func 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)
无缓冲通道本质上是阻塞的,即写入channel(hom.ch <- "message sent")和从channel(fmt.Println(<-h.ch))读取阻止go-routine.
在您的情况下,http服务器未运行,因为hom.ch <- "message sent"阻止执行.这就是GET请求无效的原因.
一个简单的解决方案是使其成为缓冲通道.