package main type game struct { players map[*player]bool broadcast chan *player register chan *player unregister chan *player } var g = game{ broadcast: make(chan *player), register: make(chan *player), unregister: make(chan *player), players: make(map[*player]bool), } func (g *game) run() { for { select { case c := <-g.register: g.players[c] = true case c := <-g.unregister: delete(g.players, c) close(c.send) case p := <-g.broadcast: for c := range g.players { if p != c { select { case c.send <- p: default: delete(g.players, c) close(c.send) go c.ws.Close() } } } } } }