func clientHandler(ctx context.Context, c *wsock.Client, evStore evstore.Connection) { var ( err error ) // state := make(ScalarState) log.Println("clientProcessor Client connected. ", c.Request()) id := c.Request().FormValue("id") tag := c.Request().FormValue("tag") _, toWS, doneCh := c.GetChannels() if tag != "" { err = evStore.Listenner2().Subscribe2(tag, messageHandler) if err != nil { log.Println("Can't subscribe to evStore", err) return } ctx2 := context.WithValue(ctx, "toWS", toWS) ctx3, cancel := context.WithCancel(ctx2) defer cancel() go evStore.Listenner2().Listen(ctx3, id) } else { js := wsock.MessageT{} js["response"] = "ERROR: No tag to subscribe" toWS <- &js } log.Println("Enter main loop serving client") Loop: for { select { case <-doneCh: log.Println("Client disconnected. Exit goroutine") break Loop } } log.Println("Exit clientProcessor") }