教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go 简单计数器

go 简单计数器

发布时间:2021-12-07   编辑:jiaochengji.com
教程集为您提供go 简单计数器等资源,欢迎您收藏本站,我们将为您提供最新的go 简单计数器资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h2>go 简单计数器</h2> <ul><li>限流器定义</li></ul><pre><code class="lang-go hljs"><span class="token keyword">type</span> RequestLimitService <span class="token keyword">struct</span> <span class="token punctuation">{</span> Interval time<span class="token punctuation">.</span>Duration <span class="token comment">// 设置时间窗口大小</span> MaxCount <span class="token builtin">int</span> <span class="token comment">// 窗口内能支持的最大请求数(阈值)</span> Lock sync<span class="token punctuation">.</span>Mutex <span class="token comment">// 并发控制锁</span> ReqCount <span class="token builtin">int</span> <span class="token comment">// 当前窗口请求数(计数器)</span> <span class="token punctuation">}</span> </code></pre> <ul><li>实现限流器的两个核心方法</li></ul><pre><code class="lang-go hljs"> <span class="token comment">// 判断当前窗口请求数是否大于最大请求数</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>reqLimit <span class="token operator">*</span>RequestLimitService<span class="token punctuation">)</span> <span class="token function">IsAvailable</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">return</span> reqLimit<span class="token punctuation">.</span>ReqCount <span class="token operator"><</span> reqLimit<span class="token punctuation">.</span>MaxCount <span class="token punctuation">}</span> <span class="token comment">// 对当前窗口请求数 1</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>reqLimit <span class="token operator">*</span>RequestLimitService<span class="token punctuation">)</span> <span class="token function">Increase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> reqLimit<span class="token punctuation">.</span>ReqCount <span class="token operator"> =</span> <span class="token number">1</span> <span class="token punctuation">}</span> </code></pre> <ul><li>生成限流器</li></ul><pre><code class="lang-go hljs"> <span class="token keyword">func</span> <span class="token function">NewRequestLimitService</span><span class="token punctuation">(</span>interval time<span class="token punctuation">.</span>Duration<span class="token punctuation">,</span> maxCnt <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">*</span>RequestLimitService <span class="token punctuation">{</span> reqLimit <span class="token operator">:=</span> <span class="token operator">&</span>RequestLimitService<span class="token punctuation">{</span> Interval<span class="token punctuation">:</span> interval<span class="token punctuation">,</span> MaxCount<span class="token punctuation">:</span> maxCnt<span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ticker <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">NewTicker</span><span class="token punctuation">(</span>interval<span class="token punctuation">)</span> <span class="token comment">// 当达到窗口时间,将计数器清零</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> <span class="token operator"><-</span>ticker<span class="token punctuation">.</span>C reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"Reset Count..."</span><span class="token punctuation">)</span> reqLimit<span class="token punctuation">.</span>ReqCount <span class="token operator">=</span> <span class="token number">0</span> reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">return</span> reqLimit <span class="token punctuation">}</span> </code></pre> 到此这篇关于“go 简单计数器”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang 基础教程
Golang库集合
Go协程与协程池
Go 协程的开启和退出
Go语言发展历史、核心、特性及学习路线
Go 语言一本通
Go语言爱好者周刊:第 78 期 — 这道关于 goroutine 的题
go语言和php的区别是什么?
Golang并发利用sync.WaitGroup实现协程同步
dubbo-go 的开发、设计与功能介绍

[关闭]
~ ~