322 lines
16 KiB
Plaintext
Generated

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Go Em Exemplos: Slices</title>
<link rel=stylesheet href="site.css">
</head>
<script>
onkeydown = (e) => {
if (e.key == "ArrowLeft") {
window.location.href = 'arrays';
}
if (e.key == "ArrowRight") {
window.location.href = 'maps';
}
}
</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> é um importante tipo de dado em Go,
oferecendo uma interface mais completa do que
arrays para lidar com sequências.</p>
</td>
<td class="code empty leading">
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<a target="_blank" href="https://go.dev/play/p/qAON5gPJwlP"><img title="Executar código em nova aba" src="play.png" class="run" /></a><img title="Copiar código" src="clipboard.png" class="copy" />
<pre class="chroma"><span class="kn">package</span> <span class="nx">main</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Diferente de arrays, slices são tipados apenas com
tipo dos elementos que armazenará (sem um tamanho).
Para criar um slice vazio, com tamanho não zero,
deve-se usar o comando nativo <code>make</code>. Aqui é feito
um slice de <code>string</code>, com tamanho 3
(inicialmente com valor padrão zero).</p>
</td>
<td class="code leading">
<pre class="chroma">
<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="nf">Println</span><span class="p">(</span><span class="s">&#34;vazio:&#34;</span><span class="p">,</span> <span class="nx">s</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Para alterar os valores de um slice e seleciná-los,
faz-se da mesma forma que com array.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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">&#34;a&#34;</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">&#34;b&#34;</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">&#34;c&#34;</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;exibe slice:&#34;</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="nf">Println</span><span class="p">(</span><span class="s">&#34;valor índice 2:&#34;</span><span class="p">,</span> <span class="nx">s</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p><code>len</code> retorna o tamanho de slices, da mesma forma
que com arrays.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;len:&#34;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">s</span><span class="p">))</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Em adição a estas operações básicas, slices
suportam muitas outras que as fazem mais úteis do que
arrays. Uma delas é a função nativa <code>append</code>, que
retorna a slice contendo um ou mais novos valores.
Note que é preciso aceitar o valor retornado da função
<code>append</code> para ter a slice atualizada.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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">&#34;d&#34;</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">&#34;e&#34;</span><span class="p">,</span> <span class="s">&#34;f&#34;</span><span class="p">)</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;slice com acréscimo:&#34;</span><span class="p">,</span> <span class="nx">s</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Slices também podem ser copiadas com <code>copy</code>. Aqui
é criado uma slice vazia <code>c</code> do mesmo tamanho da
slice <code>s</code>. Então, a slice <code>s</code> é copiada para <code>c</code>.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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="nf">Println</span><span class="p">(</span><span class="s">&#34;slice copiada:&#34;</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Slices suportam um operador &ldquo;slice&rdquo; com a sintaxe
<code>slice[índiceBaixo:índiceAlto]</code>. Por exemplo, o
comando a seguir seleciona os elementos da slice
de índices 2, 3 e 4; ou <code>s[2]</code>, <code>s[3]</code>, e <code>s[4]</code>.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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="nf">Println</span><span class="p">(</span><span class="s">&#34;slice 1:&#34;</span><span class="p">,</span> <span class="nx">l</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Já este, &ldquo;fatia&rdquo; o slice <code>s</code> até o
índice 5 (não incluso) ou <code>s[5]</code>.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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="nf">Println</span><span class="p">(</span><span class="s">&#34;slice 2:&#34;</span><span class="p">,</span> <span class="nx">l</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>E este, &ldquo;fatia&rdquo; o slices <code>s</code> a partir do
índice 2 (incluso) ou <code>s[2]</code>.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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="nf">Println</span><span class="p">(</span><span class="s">&#34;slice 3:&#34;</span><span class="p">,</span> <span class="nx">l</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Também é possível declarar e inicializar um
slice em apenas uma linha.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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">&#34;g&#34;</span><span class="p">,</span> <span class="s">&#34;h&#34;</span><span class="p">,</span> <span class="s">&#34;i&#34;</span><span class="p">}</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;slice inicializada:&#34;</span><span class="p">,</span> <span class="nx">t</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Slices podem ser compsotas em estruturas
multi-dimensionais. O tamanho das slices internas
pode variar, diferente de arrays multi-dimensionais.</p>
</td>
<td class="code">
<pre class="chroma">
<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">&lt;</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">&lt;</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="nf">Println</span><span class="p">(</span><span class="s">&#34;bi-dimensional: &#34;</span><span class="p">,</span> <span class="nx">twoD</span><span class="p">)</span>
<span class="p">}</span>
</pre>
</td>
</tr>
</table>
<table>
<tr>
<td class="docs">
<p>Note que enquanto slices são tipos diferentes
de arrays, eles são exibidos de maneira similar
pelo comando <code>fmt.Println</code>.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="gp">$</span> go run slices.go
<span class="go">vazio: [ ]
</span><span class="go">exibe slice: [a b c]
</span><span class="go">valor índice 2: c
</span><span class="go">len: 3
</span><span class="go">slice com acréscimo: [a b c d e f]
</span><span class="go">slice copiada: [a b c d e f]
</span><span class="go">slice 1: [c d e]
</span><span class="go">slice 2: [a b c d e]
</span><span class="go">slice 3: [c d e f]
</span><span class="go">slice inicializada: [g h i]
</span><span class="go">bi-dimensional: [[0] [1 2] [2 3 4]]</span></pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Veja esse <a href="https://go.dev/blog/slices-intro">post</a>
do time de Go para mais detalhes sobre o design e
implementação de slices na linguagem.</p>
</td>
<td class="code empty leading">
</td>
</tr>
<tr>
<td class="docs">
<p>Agora que vimos arrays e slices, passaremos a estudar
outra estrutura de dados nativa de Go: maps.</p>
</td>
<td class="code empty">
</td>
</tr>
</table>
<p class="next">
Próximo exemplo: <a href="maps">Maps</a>.
</p>
<p class="footer">
Por <a href="https://markmcgranaghan.com">Mark McGranaghan</a> e <a href="https://eli.thegreenplace.net">Eli Bendersky</a> | traduzido por <a href="https://github.com/lucassauro">Lucassauro</a> | <a href="https://github.com/lucassauro/gobyexample">contribua</a> | <a href="https://github.com/mmcgrana/gobyexample#license">licença</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(' s :\u003D make([]string, 3)\u000A fmt.Println(\"vazio:\", s)\u000A');codeLines.push(' s[0] \u003D \"a\"\u000A s[1] \u003D \"b\"\u000A s[2] \u003D \"c\"\u000A fmt.Println(\"exibe slice:\", s)\u000A fmt.Println(\"valor índice 2:\", s[2])\u000A');codeLines.push(' fmt.Println(\"len:\", len(s))\u000A');codeLines.push(' s \u003D append(s, \"d\")\u000A s \u003D append(s, \"e\", \"f\")\u000A fmt.Println(\"slice com acréscimo:\", s)\u000A');codeLines.push(' c :\u003D make([]string, len(s))\u000A copy(c, s)\u000A fmt.Println(\"slice copiada:\", c)\u000A');codeLines.push(' l :\u003D s[2:5]\u000A fmt.Println(\"slice 1:\", l)\u000A');codeLines.push(' l \u003D s[:5]\u000A fmt.Println(\"slice 2:\", l)\u000A');codeLines.push(' l \u003D s[2:]\u000A fmt.Println(\"slice 3:\", l)\u000A');codeLines.push(' t :\u003D []string{\"g\", \"h\", \"i\"}\u000A fmt.Println(\"slice inicializada:\", t)\u000A');codeLines.push(' twoD :\u003D make([][]int, 3)\u000A for i :\u003D 0; i \u003C 3; i++ {\u000A innerLen :\u003D i + 1\u000A twoD[i] \u003D make([]int, innerLen)\u000A for j :\u003D 0; j \u003C innerLen; j++ {\u000A twoD[i][j] \u003D i + j\u000A }\u000A }\u000A fmt.Println(\"bi-dimensional: \", twoD)\u000A}\u000A');codeLines.push('');codeLines.push('');codeLines.push('');
</script>
<script src="site.js" async></script>
</body>
</html>