package games type Games struct { addChan chan *Game listChan chan listChan } type listChan chan []*Game func New() Games { games := Games{ addChan: make(chan *Game), listChan: make(chan listChan), } go serveGames(games) return games } func serveGames(games Games) { gamesMap := make(map[int64]*Game) for { select { case game := <-games.addChan: gamesMap[game.Id] = game case r := <-games.listChan: v := make([]*Game, 0, len(gamesMap)) for _, value := range gamesMap { v = append(v, value) } r <- v } } } func (games Games) AddGame(game *Game) { games.addChan <- game } func (games Games) ListGames() []*Game { r := make(chan []*Game) games.listChan <- r return <-r }