使用golang设计一个key是playerid,value是channel的map。当写入数据的时候,如果playerid对应的channel不存在,那么创建一个channel,并将数据写入channel ; 定时检查当channel为空的时候,10s后删除该值,并且该map可以并发使用。

时间: 2023-03-28 07:03:14 浏览: 250
好的,这是一个关于使用golang设计一个key是playerid,value是channel的map的问题。可以使用sync包中的Mutex来实现并发使用,使用time包中的Ticker来定时检查channel是否为空并删除。具体实现可以参考以下代码: ```go package main import ( "sync" "time" ) type Player struct { channel chan interface{} mutex sync.Mutex } type PlayerMap struct { players map[string]*Player mutex sync.Mutex } func NewPlayerMap() *PlayerMap { return &PlayerMap{ players: make(map[string]*Player), } } func (pm *PlayerMap) Write(playerID string, data interface{}) { pm.mutex.Lock() defer pm.mutex.Unlock() player, ok := pm.players[playerID] if !ok { player = &Player{ channel: make(chan interface{}), } pm.players[playerID] = player } player.mutex.Lock() defer player.mutex.Unlock() player.channel <- data } func (pm *PlayerMap) StartCleaner() { ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() for range ticker.C { pm.mutex.Lock() for playerID, player := range pm.players { player.mutex.Lock() select { case <-player.channel: // Channel not empty, do nothing default: // Channel empty, delete player delete(pm.players, playerID) } player.mutex.Unlock() } pm.mutex.Unlock() } } ``` 使用示例: ```go func main() { pm := NewPlayerMap() // Start cleaner go pm.StartCleaner() // Write data pm.Write("player1", "data1") pm.Write("player2", "data2") // Wait for data to be processed time.Sleep(1 * time.Second) } ```
阅读全文

相关推荐