Go 实现 设置速率限制访问

5 min read

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,以确保它会被正确地清理掉。