Reputation: 1228
If I use a chan anywhere on main or func home, the application runs, but it doesn't really work. No errors thrown, however, it won't work. If I remove the channels references, it goes back to working. Either by using a chan in a struct or a global channel the application stops working.
In a GET
request, it returns h.Message
from func home
by adding any channel in the code, GET
request wont return the message.
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)
}
}
Upvotes: 1
Views: 792
Reputation: 9022
Unbuffered channels are blocking in nature, i.e. writing to channel (hom.ch <- "message sent"
) and reading from channel (fmt.Println(<-h.ch)
) block the go-routine.
In your case, http
server is not running because hom.ch <- "message sent"
blocks the execution. That's why GET
request is not working.
One simple solution can be to make it buffered channel instead.
Upvotes: 6