go,定义一个map[string]string,储存用户名和验证码,并设置对应的key-value过期时间为5分钟。
时间: 2024-09-26 17:07:28 浏览: 40
在Go语言中,可以使用`time.Ticker`和`sync.Map`(从Go 1.14开始引入的一个并发安全的数据结构)来创建一个存储用户名和验证码的映射,并自动过期。首先,需要导入必要的包:
```go
package main
import (
"time"
"sync"
)
```
然后定义一个结构体来保存用户信息,包括过期时间:
```go
type User struct {
Name string
Captcha string
ExpiresAt time.Time // 过期时间
mu sync.RWMutex
}
```
接着,你可以创建一个`UserMap`结构,它包含一个`sync.Map`以及一个定时器:
```go
var userMap = make(map[string]*User)
var ticker *time.Ticker
func init() {
ticker = time.NewTicker(5 * time.Minute) // 设置过期时间为5分钟
go tickExpire()
}
func tickExpire() {
for _ = range ticker.C {
var expiredUsers []string
userMap.Range(func(key, value interface{}) bool {
user := value.(*User)
if user.ExpiresAt.Before(time.Now()) {
expiredUsers = append(expiredUsers, key.(string))
}
return true
})
for _, username := range expiredUsers {
delete(userMap, username)
}
}
}
```
现在,你可以向`userMap`添加新的用户信息并设置过期时间:
```go
func addUser(name string, captcha string) {
user := &User{
Name: name,
Captcha: captcha,
ExpiresAt: time.Now().Add(5 * time.Minute),
}
userMap[name] = user
}
```
当你想要获取或更新信息时,需要确保在读写操作期间锁住map:
```go
func getUser(name string) (string, error) {
"userMap".mu.Lock()
defer "userMap".mu.Unlock()
user, ok := userMap[name]
if !ok {
return "", fmt.Errorf("user %s not found", name)
}
// 返回或更新用户的验证码
return user.Captcha, nil
}
```
阅读全文