代码拉取完成,页面将自动刷新
同步操作将从 kzquu/wego 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package ratelimit
import (
"io"
"time"
)
// New New
// rate 速度,rate/每秒
func New(rate int64) *Limiter {
return &Limiter{
rate: time.Duration(rate),
count: 0,
t: time.Now(),
}
}
// Reader 返回一个带有Limiter的io.Reader
func Reader(r io.Reader, l *Limiter) io.Reader {
return &reader{
r: r,
l: l,
}
}
// ReadSeeker 返回一个带有Limiter的io.ReadSeeker
func ReadSeeker(rs io.ReadSeeker, l *Limiter) io.ReadSeeker {
return &readSeeker{
reader: reader{
r: rs,
l: l,
},
s: rs,
}
}
// Writer 返回一个带有Limiter的io.Writer
func Writer(w io.Writer, l *Limiter) io.Writer {
return &writer{
w: w,
l: l,
}
}
// Limiter 速度限制器
type Limiter struct {
rate time.Duration
count int64 // 最大8G
t time.Time
}
// Wait 传入需要处理的数量,计算并等待需要经过的时间
func (l *Limiter) Wait(count int) {
l.count += int64(count)
t := time.Duration(l.count)*time.Second/l.rate - time.Since(l.t)
if t > 0 {
time.Sleep(t)
}
}
type reader struct {
r io.Reader
l *Limiter
}
// Read Read
func (r *reader) Read(buf []byte) (int, error) {
n, err := r.r.Read(buf)
r.l.Wait(n)
return n, err
}
type readSeeker struct {
reader
s io.Seeker
}
func (rs *readSeeker) Seek(offset int64, whence int) (int64, error) {
return rs.s.Seek(offset, whence)
}
type writer struct {
w io.Writer
l *Limiter
}
// Write Write
func (w *writer) Write(buf []byte) (int, error) {
w.l.Wait(len(buf))
return w.w.Write(buf)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。