Golang 中提供了一个 time.Ticker
类型,可以定期触发事件。我们可以使用它来实现速率限制访问。
以下是一个简单的示例代码,演示如何每秒钟限制访问两次:
package main
import (
"fmt"
"time"
)
func main() {
limit := 2 // 限制次数
duration := 1 * time.Second // 持续时间
ticker := time.NewTicker(duration / time.Duration(limit))
defer ticker.Stop()
count := 0
for now := range ticker.C {
if count >= limit {
fmt.Println("Rate limit exceeded!")
break
}
fmt.Println("Access granted at", now)
count++
}
}
在上面的代码中,我们创建了一个 time.Ticker
,并在其周期性触发的时间段内执行操作。在每个周期内,我们检查目前的总访问次数是否超过了限制,如果超过了限制,我们就退出循环并打印一条超过访问限制的消息。如果没有超过限制,我们就可以执行相应的操作,例如访问某个 API 或者访问某个网站。在上面的代码中,我们简单地打印了一条访问授权消息。
请注意,我们在创建 time.Ticker
时,将其周期设置为从持续时间除以限制次数得到的时间间隔。这可以确保我们在持续时间内最多只能执行限制次数次操作。我们还在循环结束时使用 defer
停止了 time.Ticker
,以确保它会被正确地清理掉。