Refilling Tokens Over Time
Tokenlarni vaqt bo'yicha to'ldirish
Qo'lda Refill(n) chaqirish real dasturda noqulay — kimdir har doim "vaqt keldi" deb aytib turishi kerak bo'ladi. Yaxshiroq yondashuv: savat qancha vaqt o'tganini biladi va shu vaqtga mos ravishda avtomatik nechta token qo'shishni hisoblaydi — belgilangan tezlik (rate) asosida, masalan "soniyasiga 2 token".
func (b *TokenBucket) RefillElapsed(elapsed time.Duration) {
added := int(elapsed.Seconds() * b.rate)
b.tokens += added
if b.tokens > b.capacity {
b.tokens = b.capacity
}
}Muhim dizayn qarori: bu metod time.Now()ni o'zi chaqirmaydi — u tashqaridan allaqachon hisoblangan elapsed time.Durationni qabul qiladi. Bu — sinovga oson andaza: real dasturda time.Since(lastRefill) bilan chaqirasiz, lekin bu darsda (va testlarda) o'tgan vaqtni to'g'ridan-to'g'ri belgilashimiz mumkin, natija har doim bir xil, kutilgan bo'ladi.
>_ Exercise
rate float64 maydonini ham o'z ichiga olgan TokenBucket va NewTokenBucket(capacity int, rate float64) *TokenBucket konstruktorini yozing. RefillElapsed(elapsed time.Duration) metodini yozing — u elapsed.Seconds() * b.rateni butun songa aylantirib (int(...)) tokensga qo'shadi, capacitydan oshib ketmasligini ta'minlaydi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Vaqtga asoslangan to'ldirish time.Now()ni o'zi chaqirish o'rniga, allaqachon hisoblangan elapsed time.Durationni parametr sifatida qabul qiladi. Bu dizayn qarori funksiyani real vaqtdan mustaqil, bashorat qilinadigan va sinash oson qiladi.
NEXT UP
Allow or Deny: Weighted Requests
$ go run main.go
Kodingizni ishga tushiring