教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言 使用select解决从管道取数据阻塞的问题 (Golang经典编程案例)

Go语言 使用select解决从管道取数据阻塞的问题 (Golang经典编程案例)

发布时间:2022-03-25   编辑:jiaochengji.com
教程集为您提供Go语言 使用select解决从管道取数据阻塞的问题 (Golang经典编程案例)等资源,欢迎您收藏本站,我们将为您提供最新的Go语言 使用select解决从管道取数据阻塞的问题 (Golang经典编程案例)资源
<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>

使用select解决从管道取数据阻塞的问题,语法如下:

案例演示:

<pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"time"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//1.定义一个管道,可放10个int类型的数据</span> intChan <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">chan</span> <span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span> intChan<span class="token operator"><-</span> i <span class="token punctuation">}</span> <span class="token comment">//2.定义一个管道,可以放5个string类型的数据</span> stringChan <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">chan</span> <span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">5</span><span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span> stringChan<span class="token operator"><-</span> <span class="token string">"hello"</span> <span class="token operator"> </span> fmt<span class="token punctuation">.</span><span class="token function">Sprintf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span>i<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">//传统的方法遍历管道时,如果不关闭会阻塞而导致deadlock</span> <span class="token comment">//在实际的开发中,我们不好确定什么时候该关闭管道!!!!</span> <span class="token comment">//这时可以用select方式可以解决</span> <span class="token comment">//label:</span> <span class="token keyword">for</span><span class="token punctuation">{</span> <span class="token keyword">select</span> <span class="token punctuation">{</span> <span class="token comment">//管道不关闭不会deadlock,会自动到下一个case匹配</span> <span class="token keyword">case</span> v <span class="token operator">:=</span> <span class="token operator"><-</span>intChan<span class="token punctuation">:</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"从intChan读取的数据%d\n"</span><span class="token punctuation">,</span>v<span class="token punctuation">)</span> time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span> <span class="token keyword">case</span> v <span class="token operator">:=</span> <span class="token operator"><-</span>stringChan<span class="token punctuation">:</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"从stringChan读取的数据%d\n"</span><span class="token punctuation">,</span>v<span class="token punctuation">)</span> time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span> <span class="token keyword">default</span><span class="token punctuation">:</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"取不到数据。。。\n"</span><span class="token punctuation">)</span> time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token comment">//break label</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre>

执行结果如下图所示:

到此这篇关于“Go语言 使用select解决从管道取数据阻塞的问题 (Golang经典编程案例)”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
如何在golang中关闭bufio.reader_golang 并发编程
Go语言 使用select解决从管道取数据阻塞的问题 (Golang经典编程案例)
go语言管道总结
Go语言基础(3)
想系统学习GO语言(Golang
从Deadlock报错理解Go channel机制(一)
一文读透GO语言的通道
Go 并发编程的思考
图解 Go 并发编程
2020-10-19Go语言goroutine和channel

[关闭]
~ ~