<!DOCTYPE html> <html> <head> <meta http-eqiv="content-type" content="text/html;charset=utf-8"> <title>Go by Example: Slices</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="slices"> <h2><a href="./">Go by Example</a>: Slices</h2> <table> <tr> <td class="docs"> <p><em>Slices</em> are a key data type in Go, giving a more powerful interface to sequences than arrays.</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/dPQErsP6Yc"><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">main</span><span class="p">()</span> <span class="p">{</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>Unlike arrays, slices are typed only by the elements they contain (not the number of elements). To create an empty slice with non-zero length, use the builtin <code>make</code>. Here we make a slice of <code>string</code>s of length <code>3</code> (initially zero-valued).</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">s</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">string</span><span class="p">,</span> <span class="mi">3</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">"emp:"</span><span class="p">,</span> <span class="nx">s</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>We can set and get just like with arrays.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">s</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">=</span> <span class="s">"a"</span> <span class="nx">s</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">=</span> <span class="s">"b"</span> <span class="nx">s</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">=</span> <span class="s">"c"</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"set:"</span><span class="p">,</span> <span class="nx">s</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">"get:"</span><span class="p">,</span> <span class="nx">s</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p><code>len</code> returns the length of the slice as expected.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"len:"</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">s</span><span class="p">))</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>In addition to these basic operations, slices support several more that make them richer than arrays. One is the builtin <code>append</code>, which returns a slice containing one or more new values. Note that we need to accept a return value from append as we may get a new slice value.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">s</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="s">"d"</span><span class="p">)</span> <span class="nx">s</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span> <span class="s">"e"</span><span class="p">,</span> <span class="s">"f"</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">"apd:"</span><span class="p">,</span> <span class="nx">s</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>Slices can also be <code>copy</code>’d. Here we create an empty slice <code>c</code> of the same length as <code>s</code> and copy into <code>c</code> from <code>s</code>.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">c</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">string</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">s</span><span class="p">))</span> <span class="nb">copy</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="nx">s</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">"cpy:"</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>Slices support a “slice” operator with the syntax <code>slice[low:high]</code>. For example, this gets a slice of the elements <code>s[2]</code>, <code>s[3]</code>, and <code>s[4]</code>.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">l</span> <span class="o">:=</span> <span class="nx">s</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">5</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">"sl1:"</span><span class="p">,</span> <span class="nx">l</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>This slices up to (but excluding) <code>s[5]</code>.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">l</span> <span class="p">=</span> <span class="nx">s</span><span class="p">[:</span><span class="mi">5</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">"sl2:"</span><span class="p">,</span> <span class="nx">l</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>And this slices up from (and including) <code>s[2]</code>.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">l</span> <span class="p">=</span> <span class="nx">s</span><span class="p">[</span><span class="mi">2</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">"sl3:"</span><span class="p">,</span> <span class="nx">l</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>We can declare and initialize a variable for slice in a single line as well.</p> </td> <td class="code leading"> <div class="highlight"><pre> <span class="nx">t</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"g"</span><span class="p">,</span> <span class="s">"h"</span><span class="p">,</span> <span class="s">"i"</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">"dcl:"</span><span class="p">,</span> <span class="nx">t</span><span class="p">)</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>Slices can be composed into multi-dimensional data structures. The length of the inner slices can vary, unlike with multi-dimensional arrays.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">twoD</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([][]</span><span class="kt">int</span><span class="p">,</span> <span class="mi">3</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">innerLen</span> <span class="o">:=</span> <span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="nx">twoD</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span> <span class="nx">innerLen</span><span class="p">)</span> <span class="k">for</span> <span class="nx">j</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">j</span> <span class="p"><</span> <span class="nx">innerLen</span><span class="p">;</span> <span class="nx">j</span><span class="o">++</span> <span class="p">{</span> <span class="nx">twoD</span><span class="p">[</span><span class="nx">i</span><span class="p">][</span><span class="nx">j</span><span class="p">]</span> <span class="p">=</span> <span class="nx">i</span> <span class="o">+</span> <span class="nx">j</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="s">"2d: "</span><span class="p">,</span> <span class="nx">twoD</span><span class="p">)</span> <span class="p">}</span> </pre></div> </td> </tr> </table> <table> <tr> <td class="docs"> <p>Note that while slices are different types than arrays, they are rendered similarly by <code>fmt.Println</code>.</p> </td> <td class="code leading"> <div class="highlight"><pre><span class="gp">$</span> go run slices.go <span class="go">emp: [ ]</span> <span class="go">set: [a b c]</span> <span class="go">get: c</span> <span class="go">len: 3</span> <span class="go">apd: [a b c d e f]</span> <span class="go">cpy: [a b c d e f]</span> <span class="go">sl1: [c d e]</span> <span class="go">sl2: [a b c d e]</span> <span class="go">sl3: [c d e f]</span> <span class="go">dcl: [g h i]</span> <span class="go">2d: [[0] [1 2] [2 3 4]]</span> </pre></div> </td> </tr> <tr> <td class="docs"> <p>Check out this <a href="http://blog.golang.org/2011/01/go-slices-usage-and-internals.html">great blog post</a> by the Go team for more details on the design and implementation of slices in Go.</p> </td> <td class="code empty leading"> </td> </tr> <tr> <td class="docs"> <p>Now that we’ve seen arrays and slices we’ll look at Go’s other key builtin data structure: maps.</p> </td> <td class="code empty"> </td> </tr> </table> <p class="next"> Next example: <a href="maps">Maps</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/slices">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a> </p> </div> </body> </html>