使用golang设计一个key是playerid,value是channel的map。当写入数据的时候,如果playerid对应的值不存在,那么创建该值,并将数据写入 ; 当channel为空的时候,10s后删除该值,并且该map可以并发使用。
时间: 2023-03-28 15:03:12 浏览: 97
好的,这是一个关于使用golang设计map的问题。可以使用sync包中的Mutex来实现并发安全,代码如下:
```go
package main
import (
"sync"
"time"
)
type Player struct {
channel string
expire time.Time
}
type PlayerMap struct {
sync.RWMutex
data map[string]*Player
}
func NewPlayerMap() *PlayerMap {
return &PlayerMap{
data: make(map[string]*Player),
}
}
func (m *PlayerMap) Set(playerID string, channel string) {
m.Lock()
defer m.Unlock()
if _, ok := m.data[playerID]; !ok {
m.data[playerID] = &Player{}
}
m.data[playerID].channel = channel
m.data[playerID].expire = time.Now().Add(10 * time.Second)
go func() {
time.Sleep(10 * time.Second)
m.Delete(playerID)
}()
}
func (m *PlayerMap) Get(playerID string) (string, bool) {
m.RLock()
defer m.RUnlock()
if player, ok := m.data[playerID]; ok {
return player.channel, true
}
return "", false
}
func (m *PlayerMap) Delete(playerID string) {
m.Lock()
defer m.Unlock()
delete(m.data, playerID)
}
func main() {
playerMap := NewPlayerMap()
playerMap.Set("player1", "channel1")
playerMap.Set("player2", "channel2")
channel1, ok1 := playerMap.Get("player1")
channel2, ok2 := playerMap.Get("player2")
channel3, ok3 := playerMap.Get("player3")
println(channel1, ok1) // channel1 true
println(channel2, ok2) // channel2 true
println(channel3, ok3) // false
time.Sleep(11 * time.Second)
channel1, ok1 = playerMap.Get("player1")
channel2, ok2 = playerMap.Get("player2")
channel3, ok3 = playerMap.Get("player3")
println(channel1, ok1) // false
println(channel2, ok2) // false
println(channel3, ok3) // false
}
```
这个代码使用了sync包中的Mutex来实现并发安全,同时使用了time包来实现10秒后自动删除的功能。在Set方法中,如果playerID对应的值不存在,则创建该值,并将数据写入;同时开启一个goroutine,在10秒后自动删除该值。在Get方法中,使用读锁来保证并发安全。在Delete方法中,使用写锁来保证并发安全。
阅读全文