1

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)
    }
}
3
  • "it doesn't work" is not a problem statement. In what way does it not work? What do you see happening? What do you expect instead? Commented Aug 6, 2018 at 1:27
  • Pouching? I have no idea what that means. But I read your entire question. Your question decidedly does not answer the question I asked you. Specifically: What do you see happening? What do you expect instead? Commented Aug 6, 2018 at 1:32
  • I expecting it to return to h.Message , for some reason, when a channel is used in there, it stops returning h.Message when a GET request is made to the server. By removing any channel from the code, it then works. Commented Aug 6, 2018 at 1:36

1 Answer 1

6

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.