gobyexample/public/range-over-channels
2019-10-14 23:20:44 +03:00

161 lines
5.7 KiB
Plaintext
Generated
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Go в примерах: Перебор значений из каналов (Range over Channels)</title>
<link rel=stylesheet href="site.css">
</head>
<script>
onkeydown = (e) => {
if (e.key == "ArrowLeft") {
window.location.href = 'closing-channels';
}
if (e.key == "ArrowRight") {
window.location.href = 'timers';
}
}
</script>
<body>
<div class="example" id="range-over-channels">
<h2><a href="./">Go в примерах</a>: Перебор значений из каналов (Range over Channels)</h2>
<table>
<tr>
<td class="docs">
<p>В <a href="range">предыдущем</a> примере мы виделе как <code>for</code> и
<code>range</code> позволяют перебирать базовые структуры. Мы
так же можем использовать этот синтаксис для чтения
значений из канала.</p>
</td>
<td class="code empty leading">
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<a href="http://play.golang.org/p/zbl7ytLnFCK" target="_blank"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<div class="highlight"><pre><span class="kn">package</span> <span class="nx">main</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kn">import</span> <span class="s">&quot;fmt&quot;</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Мы будем итерировать 2 значения в канале <code>queue</code>.</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">queue</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">string</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="nx">queue</span> <span class="o">&lt;-</span> <span class="s">&quot;one&quot;</span>
<span class="nx">queue</span> <span class="o">&lt;-</span> <span class="s">&quot;two&quot;</span>
<span class="nb">close</span><span class="p">(</span><span class="nx">queue</span><span class="p">)</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Этот <code>range</code> будет перебирать каждый элемент
полученный из канала <code>queue</code>. Но т.к. мы <code>закрыли</code>
канал ранее, перебор элементов завершится после
получения двух элементов.</p>
</td>
<td class="code">
<div class="highlight"><pre> <span class="k">for</span> <span class="nx">elem</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">queue</span> <span class="p">{</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">elem</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td>
</tr>
</table>
<table>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre><span class="gp">$</span> go run range-over-channels.go
<span class="go">one</span>
<span class="go">two</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Этот пример так же демонстрирует, что возможно
прочитать данные из канала уже после его закрытия.</p>
</td>
<td class="code empty">
</td>
</tr>
</table>
<p class="next">
Следующий пример: <a href="timers">Таймеры (Timers)</a>.
</p>
<p class="footer">
by <a href="https://markmcgranaghan.com">Mark McGranaghan</a> | <a href="https://github.com/mmcgrana/gobyexample/blob/master/examples/range-over-channels">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a>
</p>
</div>
<script>
var codeLines = [];
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import \"fmt\"\u000A');codeLines.push('func main() {\u000A');codeLines.push(' queue := make(chan string, 2)\u000A queue \x3C- \"one\"\u000A queue \x3C- \"two\"\u000A close(queue)\u000A');codeLines.push(' for elem := range queue {\u000A fmt.Println(elem)\u000A }\u000A}\u000A');codeLines.push('');codeLines.push('');
</script>
<script src="site.js" async></script>
</body>
</html>