<!DOCTYPE html> <html> <head> <meta http-eqiv="content-type" content="text/html;charset=utf-8"> <title>Go by Example: Goroutines</title> <link rel=stylesheet href="site.css"> </head> <script type="text/javascript"> if (window.location.host == "gobyexample.com") { var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-34996217-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); } </script> <body> <div class="example" id="goroutines"> <h2><a href="./">Go by Example</a>: Goroutines</h2> <table> <tr> <td class="docs"> <p>A <em>goroutine</em> is a lightweight thread of execution.</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/RW_RSAHfj-"><img title="Run code" src="play.png" class="run" /></a> <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">"fmt"</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">f</span><span class="p">(</span><span class="nx">from</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p"><</span> <span class="mi">3</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</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">from</span><span class="p">,</span> <span class="s">":"</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="p">}</span> <span class="p">}</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>Suppose we have a function call <code>f(s)</code>. Here’s how we’d call that in the usual way, running it synchronously.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">f</span><span class="p">(</span><span class="s">"direct"</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>To invoke this function in a goroutine, use <code>go f(s)</code>. This new goroutine will execute concurrently with the calling one.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="k">go</span> <span class="nx">f</span><span class="p">(</span><span class="s">"goroutine"</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>You can also start a goroutine for an anonymous function call.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="k">go</span> <span class="kd">func</span><span class="p">(</span><span class="nx">msg</span> <span class="kt">string</span><span class="p">)</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">msg</span><span class="p">)</span> <span class="p">}(</span><span class="s">"going"</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>Our two function calls are running asynchronously in separate goroutines now, so execution falls through to here. This <code>Scanln</code> code requires we press a key before the program exits.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">input</span> <span class="kt">string</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Scanln</span><span class="p">(</span><span class="o">&</span><span class="nx">input</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="s">"done"</span><span class="p">)</span> <span class="p">}</span> </pre></div> </td> </tr> </table> <table> <tr> <td class="docs"> <p>When we run this program, we see the output of the blocking call first, then the interleaved output of the two gouroutines. This interleaving reflects the goroutines being run concurrently by the Go runtime.</p> </td> <td class="code leading"> <div class="highlight"><pre><span class="gp">$</span> go run goroutines.go <span class="go">direct : 0</span> <span class="go">direct : 1</span> <span class="go">direct : 2</span> <span class="go">goroutine : 0</span> <span class="go">going</span> <span class="go">goroutine : 1</span> <span class="go">goroutine : 2</span> <span class="go"><enter></span> <span class="go">done</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>Next we’ll look at a complement to goroutines in concurrent Go programs: channels.</p> </td> <td class="code empty"> </td> </tr> </table> <p class="next"> Next example: <a href="channels">Channels</a>. </p> <p class="footer"> by <a href="https://twitter.com/mmcgrana">@mmcgrana</a> | <a href="mailto:mmcgrana@gmail.com">feedback</a> | <a href="https://github.com/mmcgrana/gobyexample/blob/master/examples/goroutines">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a> </p> </div> </body> </html>