<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Gommunity - Medium]]></title>
        <description><![CDATA[Brazilian Golang Community - Medium]]></description>
        <link>https://medium.com/gommunity?source=rss----be3bc55ebe06---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Gommunity - Medium</title>
            <link>https://medium.com/gommunity?source=rss----be3bc55ebe06---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 15:15:12 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/gommunity" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[#7 GoSchool: Funções]]></title>
            <link>https://medium.com/gommunity/funcoes-e4bc0ed50a1e?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/e4bc0ed50a1e</guid>
            <category><![CDATA[goschool]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[golang-tools]]></category>
            <category><![CDATA[golang-tutorial]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Guilherme Caruso]]></dc:creator>
            <pubDate>Thu, 29 Nov 2018 12:06:10 GMT</pubDate>
            <atom:updated>2018-11-29T16:55:22.436Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*Af-KqkJkX39YsAG35eUeEQ.png" /></figure><h4>Seja bem vindo ao tutorial #7 da GoSchool!</h4><p>Caso você tenha perdido o tutorial #6 sobre <strong>Estrutura de Dados e seus Métodos</strong>, segue o link:</p><p><a href="https://medium.com/gommunity/estrutura-de-dados-3bf942fbace1">#6 GoSchool: Estrutura de Dados e seus Métodos</a></p><p>Vamos abordar um dos recursos essenciais para todos os seus desenvolvimentos, as <strong>funções</strong>.</p><p>Por ser um assunto muito direto, vamos abordar sua estrutura por tópicos:</p><ul><li>Parâmetros;</li><li>Retornos;</li><li>Defer;</li><li>Função como Parâmetro</li></ul><p>Antes de abordarmos os tópicos, vamos entender um pouco sobre a declaração básica de uma <strong>função</strong>.</p><h3>- “Show, vamos lá!”</h3><h3>Declaração</h3><p>A declaração de uma função em Go é feita utilizando o operador func .</p><p>Possui uma estrutura obrigatória com alguns itens opcionais, apresentados a seguir:</p><pre>func nomeDaFuncao (parametros) (retorno) {}</pre><ul><li>nomeDaFuncao - Nome da função, pelo qual será chamada e identificada - [Obrigatório];</li><li>parametros - Lista de parâmetros utilizados na função - [Obrigatório];</li><li>retorno - Parâmetros de retorno da função - [Opcional]</li></ul><h3>- “Entendi como ela é declarada, mas não entendi como utilizá-la.”</h3><p><strong>Sem problemas! Vamos chamar os Gophers!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/630/1*3Nekv76AsMlXUvqIB3IaIg.png" /></figure><p>Criamos uma função que vai verificar, entre dois Gophers, qual deles é o maior, retornando o resultado para uma variável. Note que a estrutura ficou assim:</p><ul><li>maior - Nome da função;</li><li>Gophers - Parâmetros da nossa função;</li><li>Gopher - Tipo de retorno da função</li></ul><p>Nesse caso, ele irá aplicar um série de conceitos que já vimos aqui na GoSchool, e vai identificar qual dos dois Gophers é o maior.</p><p>O resultado será:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/150/1*Z24G8MnEdJ9HRYi2D9Eueg.png" /></figure><h3>- “Como devo executa-la?”</h3><p>A execução de uma função é feita da seguinte forma:</p><ul><li>Função</li></ul><pre>func teste() { //LOGICA }</pre><ul><li>Execução</li></ul><pre>func teste() { //LOGICA }</pre><pre>func main() {</pre><pre>  teste()</pre><pre>}</pre><p>Note que declaramos nossa função teste fora da função main , isso porque nesse exemplo, vamos executar essa função logo que o código for executado.</p><blockquote>Funções devem ser declaradas de forma individual e não compartilhada, podendo então, ser utilizadas por outras funções.</blockquote><p>Vamos explicar as “partes” de um função para que tudo fique mais claro!</p><p>Começando por <strong>parâmetros.</strong></p><h3>1. Parâmetros</h3><p>Os parâmetros são “valores” utilizados na lógica de uma <strong>função</strong>.</p><p>Uma conta de soma, por exemplo:</p><ul><li>5 + 3 = 8</li></ul><p>Os números 5 e 3, são os parâmetros utilizados para que a lógica operacional da soma possa ser executada.</p><p>Vamos entender melhor como utilizar parâmetros através dos tópicos:</p><ul><li>Indefinido;</li><li>Definido Simples;</li><li>Definido Composto;</li><li>Definido Composto Variável</li></ul><h4>- Indefinido</h4><p>Uma função com parâmetros indefinidos é responsável por executar algum tipo de ação sem a necessidade prévia de valores para sua lógica operacional.</p><p>Um exemplo de função com parâmetros implícitos:</p><ul><li>Função</li></ul><pre>func dizerOi() {</pre><pre>   fmt.Println(&quot;Oi&quot;)</pre><pre>}</pre><ul><li>Execução</li></ul><pre>dizerOi()</pre><pre>//OUTPUT : Oi</pre><h4>- Definido Simples</h4><p>Uma função definida simples possui apenas um parâmetro necessário para sua lógica operacional.</p><p>No momento que declaramos um parâmetro, precisamos definir seu tipo, já que nesses casos, a linguagem exige uma declaração explícita do mesmo.</p><p>Sua estrutura é:</p><pre>func nomeDaFunc (nomeDoParametro tipo)</pre><p>Um exemplo:</p><ul><li>Função</li></ul><pre>func dizNome(nome string){</pre><pre>   fmt.Printf(&quot;Olá %s&quot;, nome)</pre><pre>}</pre><ul><li>Execução</li></ul><pre>dizNome(&quot;Guilherme&quot;)</pre><pre>/OUTPUT: Olá Guilherme</pre><p>Note que para utilizarmos um parâmetro do tipo texto, foi necessário definir o tipo string após a declaração do nome.</p><p>Após criarmos a função, devemos obrigatoriamente preencher a variável solicitada pela função no momento de sua execução.</p><h4>- Definido Composto</h4><p>Diferente da função definida simples, a composta possui mais de um parâmetro de declaração.</p><p>Na definição de parâmetros também devemos especificar o tipo.</p><pre>func nomeDaFuncao (param1 tipo, param2 tipo, param3 tipo)</pre><ul><li>Parâmetros de tipos diferentes:</li></ul><pre>func nomeDaFuncao (param1 int, param2 string, param3 float32)</pre><ul><li>Parâmetros de tipos iguais:</li></ul><pre>func nomeDaFuncao(param1, param2, param3 string)</pre><p>Note quando o tipo é igual para todos, podemos defini-lo no final da declaração. Algo que simplifica e muito, a escrita de funções.</p><p>Um exemplo:</p><ul><li>Função</li></ul><pre>func declararIdade(nome string, anoNascimento int) {</pre><pre>    idade := 2018 - anoNascimento</pre><pre>    fmt.Printf(&quot;%s tem %d anos&quot;, nome, idade)</pre><pre>}</pre><ul><li>Execução</li></ul><pre>declararIdade(&quot;Guilherme&quot;, 1997)</pre><pre>//OUTPUT: Guilherme tem 21 anos</pre><p>Processo bem simples!</p><h4>- Definido Composto Variável</h4><p>Como apresentado anteriormente, parâmetros do mesmo tipo podem ser escritos de forma continua, tendo o seu tipo definido no término da declaração.</p><pre>func nomeDaFuncao(param1, param2, param3 tipo)</pre><p>Porém, nem sempre o número de parâmetros pode ser definido.</p><h3>- “Como assim?”</h3><p>Pense que você quer efetuar uma soma de diversos números. A quantidade de números é desconhecida, mas queremos executar essa operação da mesma forma.</p><p>A estrutura então, deve utilizar spread(... ),um operador lógico de distribuição :</p><pre>func nomeDaFuncao(parametros... int)</pre><p>Note que estamos declarando diversos parâmetros do tipo inteiro.</p><p>Voltando ao nosso exemplo, temos:</p><ul><li>Função</li></ul><pre>func soma(numeros... int) {</pre><pre>   var resultado int</pre><pre>   for _, num := range numeros {</pre><pre>      resultado += num      </pre><pre>   }</pre><pre>   fmt.Println(resultado)</pre><pre>}</pre><h3>- “Range, o que é isso?”</h3><p>Como não havíamos falado de array e slice antes das <a href="https://medium.com/gommunity/estrutura-de-controle-a558f5a51f08">estruturas de controle,</a> não conseguimos explicar o range .</p><p>De forma rápida e direta, o range é utilizado para percorrer um array ou slice retornando seu índice e o seu valor em um for.</p><pre>slice := []string{&quot;a&quot;, &quot;b&quot;, &quot;c&quot;}</pre><pre>for indice, valor := range slice {</pre><pre>   fmt.Printf(&quot;%d - %s\n&quot;, indice, valor)</pre><pre>}</pre><pre>//OUTPUT:<br>0 - a<br>1 - b<br>2 - c</pre><p>Agora que entendemos range</p><ul><li>Execução</li></ul><pre>soma(1, 2, 3, 4, 5, 6)</pre><pre>//OUTPUT: 21</pre><p>Note que passamos um número indeterminado de parâmetros, e mesmo assim, o sistema conseguiu executar a operação.</p><p><strong>AGORA SIM!</strong></p><p>Parâmetros entendidos, podemos falar sobre os retornos de uma função.</p><h3>2. Retornos</h3><p>O retorno de uma função é o que garante a vasta utilização de funções em todo e qualquer desenvolvimento.</p><p>Os retornos são opcionais, ou seja, podem ou não existir em uma função.</p><p>Sua declaração é feita da seguinte forma:</p><pre>func nomeDaFuncao (parametros) (retorno)</pre><p>Além disso, utilizamos dentro da função o operador return para informar o valor que será retornado.</p><p>Vamos entender um pouco melhor cada um dos tipos de retorno.</p><p>Eles podem ser:</p><ul><li>Indefinido;</li><li>Definido Simples;</li><li>Definido Composto;</li><li>Definido Nomeado</li></ul><h4>- Indefinido</h4><p>Funções que por padrão não retornam nenhum tipo de valor.</p><p>Todas as apresentadas até aqui, são funções de retorno indefinido.</p><p>Um exemplo simples é:</p><ul><li>Função</li></ul><pre>func dizerOi() {</pre><pre>   fmt.Println(&quot;Oi&quot;)</pre><pre>}</pre><ul><li>Execução</li></ul><pre>dizerOi()</pre><pre>//OUTPUT : Oi</pre><p>Note que ele executou uma ação, mas não retornou nenhum tipo de valor.</p><h4>- Definido Simples</h4><p>O retorno definido simples é composto por um único valor retornado.</p><p>Sua declaração é feita apresentando o tipo de retorno que será feito.</p><h3>- “Não entendi nada.”</h3><p>Vamos supor:</p><blockquote>Preciso de uma função que capture dois números e me retorne o valor de sua divisão.</blockquote><p>Sabemos que:</p><ul><li>2 parâmetros int;</li><li>1 retorno int;</li></ul><p>Dessa forma:</p><ul><li>Função</li></ul><pre>func divisao(num1, num2 int) int {</pre><pre>    divisao := num1 / num2<br>    <br>    return divisao </pre><pre>}</pre><ul><li>Execução</li></ul><pre>resultado := divisao(10, 2)</pre><pre>fmt.Println(resultado)</pre><pre>//OUTPUT: 5</pre><p>Note que dessa vez, colocamos nossa função em uma variável chamada resultado , já que ela possui um parâmetro de retorno.</p><p><strong>SIM! TODO PARÂMETRO DE RETORNO DEVE SER ARMAZENADO EM UMA VARIÁVEL OU CONSUMIDO COMO UM NOVO PARÂMETRO.</strong></p><h4>- Definido Composto</h4><p>O retorno definido composto garante o retorno de múltiplos valores, de diversos tipos.</p><p>Diferente da declaração de parâmetros, independente se os tipos forem iguais, é necessário especificar o retorno de cada um deles.</p><h3>- “Calma aí, explique melhor.”</h3><p>Vamos utilizar o seguinte exemplo:</p><blockquote>Preciso de uma função que receba o nome, sobrenome e ano de nascimento, que me retorne o nome completo e a idade.</blockquote><p>Beleza, possuímos:</p><ul><li>3 parâmetros ( 2 textos, 1 inteiro);</li><li>2 retornos (1 texto, 1 inteiro)</li></ul><p>Nosso exemplo deve ficar assim:</p><ul><li>Função</li></ul><pre>func retornaDados(nome, sobrenome string, anoNascimento int)(string,int){</pre><pre>    nomeCompleto := nome + &quot; &quot; + sobrenome</pre><pre>    idade := 2018 - anoNascimento</pre><pre>    return nomeCompleto, idade</pre><pre>}</pre><ul><li>Execução</li></ul><pre>nome, idade := retornaDados(&quot;Guilherme&quot;, &quot;Caruso&quot;, 1997)</pre><pre>fmt.Printf(&quot;Nome Completo: %s\n Idade: %d&quot;, nome, idade</pre><pre>//OUTPUT: <br>Nome Completo: Guilherme Caruso<br>Idade: 21 </pre><p>Note que como possuímos dois retornos, precisamos armazená-los em diferentes variáveis.</p><blockquote>O número de variáveis é exatamente o mesmo que o número de retornos.</blockquote><h3>- “Sou obrigado a utilizar todos os valores de retorno?”</h3><p><strong>Não!</strong></p><p>Porém, para que a linguagem não apresente um erro, é necessário utilizar o operador _ no lugar da variável que não deseja utilizar.</p><p>Para que isso fique claro, vamos repetir o exemplo anterior, sem utilizar o retorno de idade</p><pre>nome, _ := retornaDados(&quot;Guilherme&quot;, &quot;Caruso&quot;, 1997)</pre><pre>fmt.Printf(&quot;Nome Completo: %s&quot;, nome)</pre><pre>//OUTPUT: Nome Completo: Guilherme Caruso</pre><p>Utilizamos o _ para informar que nesse momento não queremos utilizar uma das variáveis de retorno .</p><p><strong>Simples como falar!</strong></p><p>Por fim, podemos falar de uma forma ainda mais simples de utilização dos retornos. Estou falando de <strong>retornos nomeados</strong>.</p><h4>- Definido Nomeado</h4><p>Esse método funciona da mesma forma que todos os retornos já apresentados, contudo, a variável de retorno é iniciada no momento da declaração da função.</p><h3>- “Consegue melhorar essa explicação?”</h3><p><strong>CLARO!</strong></p><p>Vamos utilizar o exemplo anterior, ok?</p><blockquote>Preciso de uma função que receba o nome, sobrenome e ano de nascimento, que me retorne o nome completo e a idade.</blockquote><ul><li>3 parâmetros ( 2 textos, 1 inteiro);</li><li>2 retornos (1 texto, 1 inteiro)</li></ul><p>A declaração fica:</p><ul><li>Função</li></ul><pre>func retornaDados(nome, sobrenome string, anoNascimento int)(nomeCompleto string, idade int) {</pre><pre>   nomeCompleto = nome + &quot; &quot; + sobrenome</pre><pre>   idade = 2018 - anoNascimento</pre><pre>   return</pre><pre>}</pre><p><strong>Sim, eu sei, ficou grandão ehhehe.</strong></p><p>Note que na declaração de retorno, especificamos as variáveis e seus respectivos tipos.</p><p>Após a execução da lógica operacional, precisamos declarar com o operador de igualdade ( = ) o valor a ser atribuído para a nova variável, finalizando o processo com o return já que o sistema reconhece de forma automática quais são as variáveis de retorno.</p><ul><li>Execução</li></ul><pre>nome, idade := retornaDados(&quot;Guilherme&quot;, &quot;Caruso&quot;, 1997)</pre><pre>fmt.Printf(&quot;Nome Completo: %s\n Idade: %d&quot;, nome, idade</pre><pre>//OUTPUT: <br>Nome Completo: Guilherme Caruso<br>Idade: 21</pre><p>A partir daqui, já estamos dominando tudo o que uma função é capaz de fazer. Agora, vamos abordar algumas funcionalidades que podem, e serão de extrema utilidade durante todos os seus desenvolvimentos.</p><h3>3. Defer</h3><p>Esse tópico será descrito de forma rápida, já que nos próximos tutoriais vamos abordar com muito mais detalhes sua utilização. Nesse momento, quero mostrar sua aplicação básica, para que seja possível começarmos a controlar o fluxo de ações dentro de um função.</p><p><strong><em>ATENÇÂO: Aqui vamos fazer uma utilização básica do </em></strong>defer<strong><em> . Nos próximos tutorais entrei com mais detalhes.</em></strong></p><h3>- “Muito aviso e pouca ação!”</h3><p>Bem, de forma direta, o operador defer garante que uma determinada função ou ação seja executada no “último” momento da função “pai”.</p><p><strong>Não entendeu? Já sabe… Gophers!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*q3pIbJBDpOQR52EaRfdbGg.png" /></figure><p>Vamos imaginar que um Gopher esta percorrendo um mapa carregando uma caixa. O conteúdo dela foi definido no inicio do percurso, porém, apenas quando o nosso querido Gopher chegar no final do trajeto, o conteúdo dela será apresentado.</p><p><strong>Viu? Fácil!</strong></p><p>O defer funciona da mesma forma.</p><p>Você define uma ação no início da lógica operacional, porém, ela só será executada no último momento da função.</p><p><strong>Vamos ao exemplo!</strong></p><blockquote>Quero uma função que faça uma saudação e me informe quando chegar ao fim.</blockquote><ul><li>Função</li></ul><pre>func mostrarFim(nome string) {</pre><pre>    defer fmt.Println(&quot;Fim da função!&quot;)</pre><pre>    fmt.Printf(&quot;Olá %s, esse é um exemplo de função com defer\n&quot;, nome)</pre><pre>}</pre><ul><li>Execução</li></ul><pre>mostrarFim(&quot;Guilherme&quot;)</pre><pre>//OUTPUT: <br>Olá Guilherme, esse é um exemplo de função com defer <br>Fim da função!</pre><p>Note que, mesmo declarando a ação com defer no inicio do escopo lógico, a mesma só foi executada no término da função.</p><p>O uso de defer é bem comum em Go, portanto, se trombar com ele por ai, lembre-se da GoSchool 😄.</p><h3>4. Função como Parâmetro</h3><p>Para fecharmos esse capítulo com chave de ouro, mostrarei uma aplicação rápida de como podemos utilizar funções como parâmetros de outras funções.</p><p><strong>SIM! ISSO É POSSÍVEL!</strong></p><p>Aproveitando a onda do defer , vamos fazer com que uma função passada como parâmetro seja chamada no término da execução de outra, ok?</p><ul><li>Funções</li></ul><pre>func printaMsg() {</pre><pre>   fmt.Println(&quot;Fim da função!&quot;)</pre><pre>}</pre><pre>func mostrarFim(nome string, funcao func()) {</pre><pre>   defer funcao()</pre><pre>   fmt.Printf(&quot;Olá %s, esse é um exemplo de função com defer e função como parâmetro \n&quot;, nome)</pre><pre>}</pre><p>Declaramos duas funções: printaMsg e mostraFim</p><p>Na função mostraFim, passamos o parâmetro funcao com o “tipo” func(), indicando que ali deve ser passada uma função.</p><ul><li>Execução</li></ul><pre>mostrarFim(&quot;Guilherme&quot;, printaMsg)</pre><pre>//OUTPUT:<br>Olá Guilherme,esse é um exemplo de função com defer e função como parâmetro<br>Fim da função!</pre><p><strong>FIM!</strong></p><h3>Conclusão</h3><p>Chegamos ao fim de mais um tutorial da Gommunity.</p><p>Espero que, a partir de agora, a utilização das funções nunca seja um problema, mas sim, uma solução para qualquer tipo de desenvolvimento.</p><p>Nesse tutorial vimos:</p><ul><li>Parâmetros;</li><li>Retornos;</li><li>Defer;</li><li>Função como Parâmetro</li></ul><p>Espero que tenha aproveitado, e não se esqueça de ajudar a Gommunity divulgando nosso conteúdo 💙.</p><p>Nos vemos no próximo tutorial!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e4bc0ed50a1e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/funcoes-e4bc0ed50a1e">#7 GoSchool: Funções</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#6 GoSchool: Estrutura de Dados e seus Métodos]]></title>
            <link>https://medium.com/gommunity/estrutura-de-dados-3bf942fbace1?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/3bf942fbace1</guid>
            <category><![CDATA[golang-tools]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[golang-tutorial]]></category>
            <category><![CDATA[goschool]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Guilherme Caruso]]></dc:creator>
            <pubDate>Mon, 26 Nov 2018 00:59:12 GMT</pubDate>
            <atom:updated>2018-11-29T12:06:50.390Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*yKGDPh2J01C-CnQWEWwIyg.png" /></figure><h4>Seja bem vindo ao tutorial #6 da GoSchool!</h4><p>Caso você tenha perdido o tutorial #5 sobre <strong>Estruturas de Controle</strong>, segue o link:</p><p><a href="https://medium.com/gommunity/estrutura-de-controle-a558f5a51f08">#5 GoSchool: Estruturas de Controle</a></p><p>Vamos falar sobre estrutura de dados abordando a sua vasta utilização em qualquer cenário de desenvolvimento.</p><p>Os tópicos abordados durante este tutorial são:</p><ul><li>Array</li><li>Slice</li><li>Map</li></ul><h3>- “Arra… o quê? ”</h3><p><strong>Calma lá, vamos por partes!</strong></p><p>Primeiro, precisamos entender que as estrutura de dados faz referência a um grupo de informações, que por sua vez, podem ser manipuladas, consultadas, alteradas e eliminadas.</p><p><strong>Não ficou claro?</strong></p><p>Vamos pensar na seguinte hipótese:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*dEhHVj5ezZDveAiHJzsEfQ.png" /></figure><p>8 Gophers estão de mãos dadas. Cada um deles possui uma posição especifica na fila (representado através dos números), e cada um possui um valor próprio, podendo ou não se repetir (representado através das cores).</p><p>Então ficamos assim:</p><ul><li>Tipo = Gopher;</li><li>Valor = Cor;</li><li>Posição = Número.</li></ul><p>Por algum motivo, quero eliminar apenas os Gophers que estão em posições de números primos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*VWhKRnH7y7W_2ogETqQ15Q.png" /></figure><p>Note que o valor foi removido, tornando nossos Gophers “nulos”. Contudo, sua posição e tipo foram mantidas, dessa forma, capazes de serem “reutilizadas”.</p><p><strong>AGORA SIM!</strong></p><ul><li>Posições que quando criadas ocupam um espaço deixando “rastros”;</li><li>Valores de mesmo tipo que podem ou não se repetir;</li><li>Ordenação bem definida.</li></ul><p>Esse é o princípio para que possamos entender o funcionamento das estruturas de dados.</p><p>Cada tipo possui suas peculiaridades, que serão abordadas a partir de agora.</p><h3>1. Array</h3><p>Aqui estamos, no “pai” das nossas estruturas de dados. O responsável por organizar e armazenar valores do mesmo tipo.</p><p>O array pode ser relacionado a uma<strong> lista de valores</strong> de<strong> mesmo tipo</strong> e <strong>tamanho pré-definido</strong>.</p><h3>- “Como utilizo esse tal de array?”</h3><p>Antes de tudo, se você nunca teve contato com programação, precisamos reestruturar o modo como você conta.</p><p><strong>SIM, O MODO COMO VOCÊ CONTA!</strong></p><p>Naturalmente, aprendemos a contar da seguinte forma:</p><blockquote>1, 2, 3, 4, 5, 6 …</blockquote><p>Por uma convenção definida a muitos anos (A long long time ago…), uma das práticas na programação é iniciar a contagem de índices a partir do 0.</p><blockquote>0, 1, 2, 3, 4, 5, 6 …</blockquote><p><strong><em>Brincadeiras a parte, existe sim uma explicação para o motivo dessa convenção, contudo não vem ao caso neste tutorial devido ao nosso escopo. Caso queira aprender sobre, da uma olhadinha </em></strong><a href="http://respostas.guj.com.br/1208-por-que-arrays-comecam-em-0-e-nao-em-1-"><strong><em>AQUI</em></strong></a><strong><em> na resposta de uma pergunta do GUJ, para uma breve explicação.</em></strong></p><p>Agora que entendemos como “contar”, podemos entrar de vez na utilização do array .</p><h3>Dicionário</h3><p>Vamos começar com o dicionário do array :</p><ul><li>Array - Estrutura de armazenamento de dados em índices;</li><li>Índice - Posição de um valor no array ;</li><li>Capacidade - Volume de índices suportados pelo array.</li></ul><p>Sua declaração é feita com a seguinte estrutura:</p><pre>var array [capacidade]tipo</pre><p>Vamos pensar assim:</p><blockquote>Preciso de uma lista de Gophers com capacidade 3.</blockquote><p>Então, declaramos:</p><pre>var array [3]Gopher</pre><p><strong><em>Atenção: Gopher é só um exemplo, logo vamos utilizar tipos reais.</em></strong></p><p>Ficamos com o seguinte resultado:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*GeJ3yXsYh83TOt3R-Gi-yQ.png" /></figure><p>Possuímos três índices do tipo Gopher, com valores nulos, ou seja, sabemos o tipo de cada índice, mas não sabemos o valor de cada tipo.</p><h3>- “Mas como informo esses valores?</h3><p>Cada valor será alocado em um índice, correto?</p><p>Dessa forma, podemos acessar o índice e atribuir um valor pra ele. O acesso fica assim:</p><pre>var array [3]Gopher</pre><pre>array[0] = &quot;Cinza&quot;<br>array[1] = &quot;Azul&quot;<br>array[2] = &quot;Rosa&quot;</pre><p>E nosso resultado final é:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*FLUcG57XXesXK3oWYgcXWw.png" /></figure><p><strong>CLARO COMO O DIA!</strong></p><h3>- “Ótimo, você utilizou um exemplo. No dia a dia, como devo aplicar um array?”</h3><h3>Declaração de Array</h3><p>Vamos mudar o exemplo :</p><blockquote>Gostaria de uma lista com o nome dos 5 maiores países do mundo.</blockquote><p>Nossa declaração e atribuição deve ficar assim:</p><pre>var paises [5]string</pre><pre>paises[0] = &quot;Rússia&quot;<br>paises[1] = &quot;Canadá&quot;<br>paises[2] = &quot;China&quot;<br>paises[3] = &quot;Estados Unidos&quot;<br>paises[4] = &quot;Brasil&quot;</pre><pre>fmt.Println(paises)</pre><pre>//OUTPUT: [Rússia Canadá China Estados Unidos Brasil]</pre><p>Note que inicializamos a variável paises com capacidade igual a 5. Feito isso, preenchemos cada um de seus índices com valores do tipo string que representam os maiores países do mundo.</p><p><strong>Quer melhor?</strong></p><p>Também é possível inicializarmos a variável do nosso array com valores já definidos.</p><pre>paises := [5]string{&quot;Rússia&quot;, &quot;Canadá&quot;, &quot;China&quot;, &quot;Estados Unidos&quot;, &quot;Brasil&quot;}</pre><pre>fmt.Println(paises)</pre><pre>//OUTPUT: [Rússia Canadá China Estados Unidos Brasil]</pre><p>Entendemos a utilização básica de um array, portanto, podemos ver uma abordagem mais detalhada com o uso de matrizes.</p><h3>Declaração de Matriz</h3><p>Durante a utilização de nosso array , também é possível criar e utilizar o conceito de matriz.</p><p><strong>Antes que me pergunte:</strong></p><p>De forma direta, uma matriz é um conjunto de valores distribuídos em linhas e colunas, que constituem uma tabela de valores multidimensionais.</p><h3>- “Continuo não entendendo…”</h3><p><strong>Vamos chamar nossos queridos Gophers!</strong></p><p>Pense em um jogo de de Gophers:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*SEtYY4guFc6J_Jr8aSah_A.png" /></figure><p>Possuímos diversos gophers, além do especial que ainda não foi desbloqueado.</p><p>Assim funcionam nossas matrizes, pois repare que cada gopher esta distribuído em um ponto de interseção entre uma linha e uma coluna.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*C2FGo7AdlRNcSO_KXsHfEA.png" /></figure><p>Nossas linhas e colunas são representadas dentro da linguagem, cada uma, por um array, ou seja, uma lista de valores diferentes, ou não, de tipos iguais.</p><h3>- “Certo, mas como declaro isso?”</h3><p>A declaração é bem simples:</p><pre>var matriz [qtdLinhas][qtdColunas]tipo</pre><p><strong>Eu sei, ficou confuso. Vou explicar.</strong></p><p>Usando a imagem anterior, repare que possuímos uma matriz 3x3, que possui 3 linhas e 3 colunas. Sabendo que cada linha e coluna é representado por um array , tudo fica mais fácil, portanto, temos:</p><pre>var matriz [3][3]Gopher</pre><p><strong><em>Atenção: Tipo Gopher é só um exemplo, logo vamos utilizar tipos reais.</em></strong></p><p>Dessa forma, tudo começa a fazer sentido.</p><p>O processo de declaração de valores pode ocorrer de duas formas, <strong>explícito</strong> e <strong>implícito</strong>.</p><h4>Declaração Explicita</h4><p>Vamos pensar dessa forma:</p><blockquote>Uma matriz 2x2 de inteiros.</blockquote><p>Sua declaração fica:</p><pre>var matriz[2][2]int</pre><p>E sua definição de valores:</p><pre>var matriz [2][2]int</pre><pre>matriz[0][0] = 1</pre><pre>matriz[0][1] = 2</pre><pre>matriz[1][0] = 3</pre><pre>matriz[1][1] = 4</pre><pre>fmt.Println(matriz)</pre><pre>//OUTPUT: [ [1, 2] [3, 4] ]</pre><p>Note que declaramos posição a posição.</p><p><strong>Não ficou claro?</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*dyw2naw0WwqfXEng5fjV4w.png" /><figcaption>L = linha; C = coluna</figcaption></figure><p>Nossa matriz é representada de acordo com o desenho acima</p><p><strong>Agora sim!</strong></p><p>Podemos deixar essa declaração ainda mais simples.</p><pre>matriz := [2][2]int{[2]int{1, 2}, [2]int{3, 4}}</pre><pre>fmt.Println(matriz)</pre><pre>//OUTPUT: [ [1, 2] [3, 4] ]</pre><h3>- “Sempre vou ter que escrever o tipo?”</h3><p>Uma das vantagens da linguagem esta na sua simplicidade, dessa forma, podemos falar das <strong>declarações implícitas</strong>.</p><h4>Declaração Implícita</h4><p>Utilizando o exemplo anterior, porém, com declarações implícitas, o resultado passa a ser:</p><pre>matriz := [2][2]int{{1, 2}, {3, 4}}</pre><pre>fmt.Println(matriz)</pre><pre>//OUTPUT: [ [1, 2] [3, 4] ]</pre><p><strong>Simples, lindo e fácil!</strong></p><h3>- “Como posso consultar um valor?”</h3><p>Lembra que cada valor está em uma posição específica de linha e coluna?</p><p>Através dessa informação encontramos e consultamos qualquer valor. Sua declaração fica:</p><pre>matriz[linhaBusca][colunaBusca] //Valor posicional</pre><p>Com valores, possuímos:</p><pre>matriz := [2][2]int{{1, 2}, {3, 4}}</pre><pre>fmt.Println(matriz[0][1])</pre><pre>//OUTPUT: 2</pre><p>Agora sim, entendemos todos os pontos relacionados a array e matriz.</p><p>Podemos falar de um parente próximo do array , com uma pequena diferença, já que o mesmo é um pouco mais “liberal”. Estou falando do slice .</p><h3>2. Slice</h3><p>O slice pode ser, de forma indireta, chamado de “array flexível” já que diferente do array convencional, não possui uma capacidade limite.</p><h3>- “Liberdade total?”</h3><p>Calma lá, não sejamos tão radicais.</p><p><strong>COM GRANDES PODERES, VEM GRANDES RESPONSABILIDADES.</strong></p><p>Primeiro vamos entender bem como funciona um slice para que seja possível tirar o máximo de proveito dessa estrutura de dados.</p><h4>Declaração</h4><ul><li>A declaração de um slice é semelhante a de um array , a única diferença é que não definimos uma capacidade.</li></ul><pre>var slice []tipo{}</pre><p>Note que quando inicializamos um slice <strong>nulo </strong>precisamos adicionar um par de chaves {} a fim de informar que ainda não existem item associados a ele. Tanto que, ao “printarmos” o valor do nosso slice , o resultado apresentado é o de uma lista vazia.</p><pre>slice := []tipo{}</pre><pre>fmt.Println(slice)</pre><pre>//OUTPUT: []</pre><p><strong>Até aqui, tudo lindo e maravilhoso!</strong></p><p>O modo anterior de declaração, por sua vez não permite a declaração literal de um slice , ou seja, caso você precise reservar um espaço inicial na memória para um número maior de elementos, precisamos utilizar a função make .</p><h3>Make</h3><p>O make permite a inicialização de um slice com tamanho definido de pré elementos e capacidade.</p><ul><li>Sua declaração é bem simples:</li></ul><pre>slice := make([]tipo, inicialização, capacidade)</pre><p>Ao utilizarmos o make , informamos que estamos inicializando um novo slice, com uma capacidade inicial já preenchida, podendo ou não ter uma capacidade final. Dessa forma, nosso sistema já reserva uma certa quantidade de memória na máquina.</p><h3>- “Complicado…”</h3><p>Vamos utilizar os Gophers para explicar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*5KUr3QlAYq31l22n-mz-iA.png" /></figure><p><strong><em>Atenção: Tipo Gopher é só um exemplo, logo vamos utilizar tipos reais.</em></strong></p><p>Repare que a declaração simples do slice não deixa nenhum tipo de pré-registro na memória, ao contrário do slice que foi inicializado com make que definiu um espaço inicial de nove valores vazios do tipo Gopher.</p><ul><li>Dessa forma, ao “printarmos” nosso slice com make , ficamos com:</li></ul><pre>slice := make([]int, 9)</pre><pre>fmt.Println(slice)</pre><pre>//OUTPUT: [0 0 0 0 0 0 0 0 0]</pre><p>Agora nosso sistema já inicializou nove itens de valor “vazio” para o tipo int .</p><h3>- “Legal, agora entendi tudo. Só queria saber como faço para obter elementos especificos de um slice”</h3><p>Assim como no array , podemos obter um elementos utilizando o seu índice:</p><pre>slice := []int{1, 2, 3}</pre><pre>fmt.Println(slice[2])</pre><pre>//OUTPUT: 3</pre><p>Porém, também podemos obter uma faixa especifica de elementos, utilizando a seguinte sintaxe:</p><pre>slice[de:até]</pre><ul><li>de - Índice inicial da busca;</li><li>até - Índice final, mas não incluso da busca.</li></ul><p>Para não enrolarmos mais:</p><pre>slice := []int{1, 2, 3, 4, 5, 6, 7}</pre><pre>fmt.Println(slice[1:4])</pre><pre>//OUTPUT: [2 3 4]</pre><p>Note que indicamos o índice 4 como final, mas o mesmo não foi incluído no resultado final, já que a linguagem exclui o índice de conclusão.</p><p><strong>Agora que a base do </strong>slice<strong> foi entendida, podemos falar de suas funções!</strong></p><p>Então vamos falar das funções que podem ser utilizadas com slice , seguindo essa ordem:</p><ul><li>len - Apresenta o tamanho do slice ;</li><li>cap - Apresenta a capacidade do slice ;</li><li>append - Permite adicionar novos itens ao slice ;</li><li>copy - Permite copiar elementos entre slice ;</li></ul><h3>Len</h3><p>De forma direta, retorna o tamanho do nosso slice .</p><ul><li>Slice</li></ul><pre>slice := []int{}</pre><pre>fmt.Println(len(slice))</pre><pre>//OUTPUT: 0</pre><ul><li>Slice com make</li></ul><pre>slice := make([]int, 9, 15)</pre><pre>fmt.Println(len(slice))</pre><pre>//OUTPUT: 9</pre><h3>Cap</h3><p>Retorna a capacidade momentânea do slice .</p><ul><li>Slice</li></ul><pre>slice := []int{}</pre><pre>fmt.Println(cap(slice))</pre><pre>//OUTPUT: 0</pre><ul><li>Slice com make</li></ul><pre>slice := make([]int, 9, 15)</pre><pre>fmt.Println(cap(slice))</pre><pre>//OUTPUT: 15</pre><h3>Append</h3><p>Permite agrupar valores ou até mesmo um slice dentro de um slice .</p><h3>- “Que confusão!”</h3><p><strong>GOPHERS!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/630/1*BklOQMqk3HpoFPC0yCuchw.png" /></figure><p>A declaração de um append é feita da seguinte forma:</p><pre>append(sliceInicial, valorVinculado)</pre><p><strong><em>Nota: Quando utilizamos um </em></strong><strong><em>append , ele nos retorna um novo slice!</em></strong></p><p>Sua utilização mais básica fica:</p><pre>slice := []int{1,2,3}</pre><pre>sliceNovo := []int{4,5,6}</pre><pre>slice = append(slice, sliceNovo...)</pre><pre>fmt.Println(slice)</pre><pre>//OUTPUT: [1 2 3 4 5 6]</pre><h3>- “Por que utilizou reticências (…) ?”</h3><p>O operador ... , chamado de spread é uma forma de declararmos todos os elementos de um slice de forma individual.</p><p>Pense no seguinte slice :</p><pre>sliceNovo := []int{1,2,3}</pre><p>Agora, sabendo que um “print” dele ficaria assim:</p><pre>//OUTPUT: [1 2 3]</pre><p>Utilizamos o operador spread para utilizar todos os itens como variáveis individuais, já que nosso append não aceita um slice como uma variável a ser acrescentada no nosso slice inicial.</p><p>Sendo assim:</p><pre>append(slice, sliceNovo...)</pre><p>É exatamento o mesmo que:</p><pre>append(slice, 1, 2, 3)</pre><h3>Copy</h3><p>Assim como o append, copy faz a “transferência” de elementos de um slice para outro.</p><p>A diferença é que o copy faz o processo de sobrescrita de valores entre posições de um slice pai e um filho.</p><p>Sua declaração é feita da seguinte forma:</p><pre>copy(sliceBase[de:ate], sliceDeCopia[de:ate])</pre><p>Também algo bem simples!</p><pre>slice := []int{1, 2, 3, 4, 5}</pre><pre>sliceNovo := []int{8, 9, 10}</pre><pre>copy(slice[0:2], sliceNovo[0:1])</pre><pre>fmt.Println(slice)</pre><pre>//OUTPUT: [8, 2, 3, 4, 5]</pre><p>Note que informamos que o primeiro elemento do slice deveria ser substituído pelo primeiro elemento do sliceNovo .</p><p><strong>Antes que me pergunte, vou abordar algumas diferenças entre o </strong><strong>append e </strong><strong>copy</strong></p><h3>Append X Copy</h3><p>Antes de apresentar detalhes em código, vamos descrever de forma simples, a lógica aplicada em cada um.</p><ul><li><strong>Append</strong></li></ul><p>Caso o capacidade de um slice seja atingida, o mesmo se encarrega de amplia-la.</p><pre>slice := make([]int, 3, 5)</pre><pre>novoSlice := []int{1, 2, 3, 4, 6, 7}</pre><pre>slice = append(slice, novoSlice...)</pre><pre>fmt.Println(slice)</pre><pre>fmt.Println(cap(slice))</pre><pre>fmt.Println(len(slice))</pre><pre>//OUTPUT:<br>[0 0 0 1 2 3 4 6 7]<br>10<br>9</pre><p><strong>Sim, você não viu errado!</strong></p><p>Mesmo declarando que a capacidade do nosso slice é 5, após preenchermos todos os “espaços” pré estabelecidos, a própria linguagem se responsabilizou de liberar mais espaço de forma exponencial.</p><p>Vendo que a capacidade de 5 foi atingida, automaticamente a mesma foi ampliada para 10, comportando-se assim sempre que for necessário.</p><ul><li><strong>Copy</strong></li></ul><p>De forma alguma o copy altera a capacidade de um slice .</p><pre>slice := make([]int, 3, 3)</pre><pre>novoSlice := []int{1, 2, 3, 4, 6, 7}</pre><pre>copy(slice, novoSlice)</pre><pre>fmt.Println(slice)</pre><pre>fmt.Println(cap(slice))</pre><pre>fmt.Println(len(slice))</pre><pre>//OUTPUT:<br>[1 2 3]<br>3<br>3</pre><p>Note que, mesmo passando um slice de capacidade maior, o copy sobrescreveu apenas a capacidade limite da variável slicepor elementos da variável novoSlice.</p><p>Enfim chegamos ao fim do slice e podemos abordar a nossa última estrutura de dados, o map .</p><h3>3. Map</h3><p>O nosso “dicionário” das estruturas de dados. O map diferente do array e do slice não se comporta por índices, mas sim pelo conceito <strong>chave/valor</strong>.</p><h3>- “Já li muito até aqui, deixe isso mais claro!”</h3><p>Pense que possuímos uma lista de produtos, e nela temos o nome do produto relacionado ao seu valor. Sendo assim, quando consultar um produto, logo, o retorno será o seu valor.</p><p>Considere a lista:</p><ul><li>Arroz (5.50)</li><li>Feijão (4.40)</li><li>Carne (15.30)</li><li>Refrigerante (7.80)</li></ul><h3>Declaração</h3><p>A declaração de um map é feita da seguinte forma:</p><pre>var lista map[tipo]tipo</pre><p>ou utilizando make</p><pre>lista := make(map[tipo]tipo)</pre><p>Note que declaramos duas vezes o tipo, já que um deles representa nossa <strong>chave</strong>, e o outro, nosso <strong>valor</strong></p><p>Voltando a lista anterior, nossa map inicializado fica assim:</p><pre>listaProdutos := make(map[string]float32)</pre><p>Seu preenchimento, segue o modelo:</p><pre>lista[chave] = valor</pre><p>Dessa forma, nossa lista de compras fica:</p><pre>listaProdutos := make(map[string]float32)</pre><pre>listaProdutos[&quot;Arroz&quot;] = 5.50<br>listaProdutos[&quot;Feijao&quot;] = 4.40<br>listaProdutos[&quot;Carne&quot;] = 15.30<br>listaProdutos[&quot;Refrigerante&quot;] = 7.80</pre><p><strong>Como estamos falando de Go, sua declaração pode ficar ainda mais simples!</strong></p><pre>listaProdutos := map[string]float32{&quot;Arroz&quot;:5.50, &quot;Feijao&quot;:4.40, &quot;Carne&quot;: 15.30, &quot;Refrigerante&quot;: 7.80}</pre><h3>- “E a consulta desses valores, como é feita?”</h3><p>Como estamos utilizando o conceito <strong>chave/valor</strong>, podemos busca-los através da <strong>chave</strong> pré-definida.</p><pre>listaProdutos := make(map[string]float32)</pre><pre>listaProdutos[&quot;Arroz&quot;] = 5.50<br>listaProdutos[&quot;Feijao&quot;] = 4.40<br>listaProdutos[&quot;Carne&quot;] = 15.30<br>listaProdutos[&quot;Refrigerante&quot;] = 7.80</pre><pre>fmt.Println(listaProdutos[&quot;Arroz&quot;])</pre><pre>//OUTPUT: 5.5</pre><p>Além da declaração simples de um map , podemos também trabalhar com conceitos de <strong>aninhamento</strong>, que trata-se de um map dentro de outro.</p><h3>Map Aninhado</h3><p>Pense agora que queremos separar produtos por categorias:</p><ul><li>Casa : [ Sofá (100.00), Colchão (80.00), Mesa (100.00)]</li><li>Cozinha: [ Faca (30.00), Colher(10.00), Garfo(10.00) ]</li></ul><p>A declaração de um map aninhado fica:</p><pre>var aninhado map[tipo]map[tipo]tipo</pre><p>Apenas adicionamos um map como valor de resposta para outro map .</p><p>Aplicando na lista anterior, ficamos com:</p><pre>var itensCasa map[string]map[string]float32</pre><p>Seu preenchimento, é semelhante ao map comum, com a única diferença de possuir um nível a mais de declaração:</p><pre>itensCasa := map[string]map[string]float32{</pre><pre>     &quot;Casa&quot;: {</pre><pre>          &quot;Sofa&quot;: 100.00,<br>          &quot;Colchao&quot;: 80.00,<br>          &quot;Mesa&quot;: 100.00,      <br>     },<br>     &quot;Cozinha&quot;: {</pre><pre>          &quot;Faca&quot;: 30.00,<br>          &quot;Colher&quot;: 10.00,<br>          &quot;Gargo&quot;: 10.00,      <br>     },</pre><pre>}</pre><p>Por fim, sua consultado ocorre por níveis:</p><pre>itensCasa := map[string]map[string]float32{</pre><pre>&quot;Casa&quot;: {</pre><pre>&quot;Sofa&quot;: 100.00,<br>          &quot;Colchao&quot;: 80.00,<br>          &quot;Mesa&quot;: 100.00,      <br>     },<br>     &quot;Cozinha&quot;: {</pre><pre>&quot;Faca&quot;: 30.00,<br>          &quot;Colher&quot;: 10.00,<br>          &quot;Gargo&quot;: 10.00,      <br>     },</pre><pre>}</pre><pre>fmt.Println(itensCasa[&quot;Casa&quot;][&quot;Sofa&quot;])</pre><pre>//OUTPUT: 100</pre><p>Para finalizarmos o assunto de map , precisamos falar de sua capacidade de exclusão de <strong>chaves.</strong></p><h3>Exclusão</h3><p>Para que seja possível excluir uma <strong>chave</strong> de um map , utilizamos a seguinte estrutura:</p><pre>delete(map, chave)</pre><p>Logo:</p><pre>listaProdutos := make(map[string]float32)</pre><pre>listaProdutos[&quot;Arroz&quot;] = 5.50<br>listaProdutos[&quot;Feijao&quot;] = 4.40</pre><pre>delete(listaProdutos, &quot;Feijao&quot;)</pre><pre>fmt.Println(listaProdutos)</pre><pre>//OUTPUT: map[Arroz:5.5]</pre><p>Note que o item “Feijao” foi deletado do map final.</p><h3>Conclusão</h3><p>Chegamos ao fim de mais um tutorial da Gommunity.</p><p><strong>ESSE FOI MUITO LONGO!</strong></p><p>Espero que a utilização das estruturas de dados tenha ficado bem claro, para que você possa tirar o máximo de proveito dessa prática no seu dia a dia, pessoal e profissional.</p><p>Nesse tutorial vimos:</p><ul><li>array ;</li><li>slice;</li><li>map</li></ul><p>Esse tutorial gigantesco merece um um aplausozinho? hahahaha</p><p>Nos vemos no próximo tutorial sobre <strong>Funções!</strong></p><p><a href="https://medium.com/gommunity/funcoes-e4bc0ed50a1e">#7 GoSchool: Funções</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3bf942fbace1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/estrutura-de-dados-3bf942fbace1">#6 GoSchool: Estrutura de Dados e seus Métodos</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Configurando o Visual Studio Code para trabalhar com Go]]></title>
            <link>https://medium.com/gommunity/configurando-o-visual-studio-code-para-trabalhar-com-go-a465ca941c7?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/a465ca941c7</guid>
            <category><![CDATA[vscode]]></category>
            <category><![CDATA[community]]></category>
            <category><![CDATA[visual-studio-code]]></category>
            <category><![CDATA[debugging]]></category>
            <category><![CDATA[go]]></category>
            <dc:creator><![CDATA[Guilherme Esteves]]></dc:creator>
            <pubDate>Mon, 19 Nov 2018 12:01:02 GMT</pubDate>
            <atom:updated>2018-11-19T12:01:02.180Z</atom:updated>
            <content:encoded><![CDATA[<h3>Configurando o Visual Studio Code para desenvolver Go</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*n8bF5ZN8ei_UfwQFsQptoA.png" /></figure><p>O Visual Studio Code é um dos melhores editores que existem, quiçá o melhor. Num mercado que era dominado pelo Sublime e via o Atom ganhar força, o VSCode atropelou todo mundo e se tornou o queridinho dos desenvolvedores.</p><p>Assim como o Atom, o Visual Studio Code é um excelente editor com um ecossistema de plugins para a maioria das linguagens e ferramentas.</p><p>Caso ainda não tenha o Visual Studio Code, você pode baixá-lo nesse link:</p><p><a href="https://code.visualstudio.com/">Visual Studio Code - The open source AI code editor | Your home for multi-agent development</a></p><p>Hoje vamos ver como configurá-lo para trabalhar com Go.</p><h4>Configurando Go no VSCode</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/684/1*fjTgSKFStfoBSdEa57ol3A.png" /></figure><p>Primeiro passo é ir na aba de extensões e pesquisar por &quot;Go&quot;, o primeiro pacote é o fornecido pela própria Microsoft, basta clicar em install.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9Q_7bNor9IAfXjBeLEwoaA.png" /></figure><p>Agora vamos ver se está tudo nos conformes. Vamos printar no terminal uma frase e ver se a sintaxe do Go está funcionando no VSCode.</p><p>Vamos escrever um código simples:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/360/1*-jNYnvUxh8aBPA98fO0kWw.png" /><figcaption><a href="https://gist.github.com/guilhermesteves/5b63833bf9c6bbf59639581c8f3c8939">https://gist.github.com/guilhermesteves/5b63833bf9c6bbf59639581c8f3c8939</a></figcaption></figure><p>Agora basta ir na aba Terminal e clicar em New Terminal (ou usar o atalho Ctrl+`) que o seu terminal aparecerá no próprio VSCode como a imagem abaixo. Agora basta salvar seu arquivo como main.go, garantir que o terminal está na mesma pasta do arquivo e rodar:</p><pre>go run main.go</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0oWL8GjaZJzvQd_AT8UjaA.png" /></figure><p>E temos a frase Welcome to Visual Studio Code printada no terminal.</p><p>(☞⌐▀͡ ͜ʖ͡▀ )☞</p><p><strong>Atenção:</strong> se você está perdido ou quer melhorar seus conhecimentos, a Gommunity tem um monte de tutoriais de Go pra te ajudar, é só clicar e ser feliz:</p><p><a href="https://medium.com/gommunity">Gommunity</a></p><h4>Debugando Go no VSCode</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KklZ57UI6NoSWCNggcUzaQ.jpeg" /></figure><p>Ter a sintaxe colorida é muito bom, mas que tal poder debugar em Go? Afinal, é bem melhor saber o que está ocorrendo a cada passo ao invés de simplesmente ficar na tentativa e erro, ou colocar um fmt.Println a cada três linhas de código.</p><p>Para começar a debugar, precisaremos de um debugger, o <a href="https://github.com/derekparker/delve">Delve</a>.</p><h4>macOS</h4><p>Garanta que você consegue compilar corretamente:</p><pre>xcode-select --install</pre><p>E instale o Delve usando go get:</p><pre>go get -u github.com/derekparker/delve/cmd/dlv</pre><p>Com esse método, você não poderá usar o backend nativo do Delve, mas não precisará dele de qualquer maneira: o backend nativo no macOS <a href="https://github.com/derekparker/delve/issues/1112">tem problemas conhecidos</a> em versões recentes do SO e não é mantido atualmente.</p><h4>Linux</h4><p>Existem 2 maneiras de instalar no Linux:</p><p>A primeira é a mais simples, usando go get:</p><pre>go get -u github.com/derekparker/delve/cmd/dlv</pre><p>Alternativamente, você precisa garantir que o $GOPATH está setado (por exemplo:~/.go) e então:</p><pre>git clone <a href="https://github.com/derekparker/delve.git">https://github.com/derekparker/delve.git</a> $GOPATH/src/github.com/derekparker/delve</pre><pre>cd $GOPATH/src/github.com/derekparker/delve</pre><pre>make install</pre><p>Muitos amantes de Linux precisam ver esse make rolando, né? :P</p><h4>Windows</h4><p><em>Nota: Eu me pergunto o porquê de estar usando Windows, mas sem julgamentos. Se quiser instalar Ubuntu, </em><a href="https://www.techtudo.com.br/dicas-e-tutoriais/noticia/2016/01/como-instalar-o-ubuntu.html"><em>pode dar uma olhada aqui</em></a><em>. Ele é rápido, seguro e simples de usar, mesmo para quem não está familiarizado com a linha de comando. Vai na fé.</em></p><p>Use o go get para buildar e instalar no Windows:</p><pre>go get -u github.com/derekparker/delve/cmd/dlv</pre><p><strong>Importante para todos os SOs:</strong> Se você estiver usando o <strong>Go 1.5</strong>, deverá definir GO15VENDOREXPERIMENT=1 antes de continuar. Essa variável de ambiente simplesmente opta pelo <a href="https://golang.org/s/go15vendor">Go 1.5 Vendor Experiment</a>.</p><p>No momento que você tiver instalado, basta clicar no espaço próximo aos números de linhas no VSCode, clicar no ícone de debug na barra lateral e dar play:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cvDShrQzNCkpEP4VtRvwYQ.png" /></figure><p>Vejam que a execução parou na linha 7. Abaixo, eu cliquei em DEBUG CONSOLE para poder ver o que está acontecendo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/206/1*ct2TN3wNa0Y7lzBv4P78zw.png" /></figure><p>Estes são os comandos que você pode fazer ao parar em uma linha (mostrados na imagem acima):</p><ul><li>Continuar a execução</li><li>Passar a linha</li><li>Entrar na função</li><li>Sair da função</li><li>Reiniciar a execução</li><li>Parar a execução</li></ul><p>E assim temos um ambiente de desenvolvimento em Go.</p><h4>Bônus</h4><p>Para facilitar não só o desenvolvimento em Go, mas em outras linguagens também, recomendo a extensão <strong>Paste JSON as Code</strong>, que reconhece o arquivo e formata o JSON que você colar para ela.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uNMmaf3Y2tb43Zts5wfekQ.png" /></figure><h4>Hey, não vá embora tão rápido</h4><p>Debugar é uma parte crucial do desenvolvimento de software, e com ferramentas como o Visual Studio Code, nossas vidas podem ser muito mais fáceis.</p><p>Usamos um exemplo simples aqui para explicar os conceitos, mas fique à vontade para adicionar o <em>debugger</em> a qualquer um dos seus projetos existentes. Você vai acabar reduzindo seus fmt.Printlnusados para logar e ver o valor/estado do código em um dado ponto durante sua execução.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8SNJrnnkA8ambWIC7XyMAA.jpeg" /></figure><p>Se você gostou desse artigo e ele te ajudou de alguma forma, deixe suas palmas ali embaixo. Isso ajuda para que outras pessoas possam encontrá-lo.</p><p>Se você tem outras configurações de VSCode ou desenvolve de um outro jeito/com outro editor/IDE, conte para nós nos comentários.</p><p>Um abraço e até breve.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a465ca941c7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/configurando-o-visual-studio-code-para-trabalhar-com-go-a465ca941c7">Configurando o Visual Studio Code para trabalhar com Go</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#5 GoSchool: Estruturas de Controle]]></title>
            <link>https://medium.com/gommunity/estrutura-de-controle-a558f5a51f08?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/a558f5a51f08</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[goschool]]></category>
            <category><![CDATA[golang-tutorial]]></category>
            <category><![CDATA[golang-tools]]></category>
            <dc:creator><![CDATA[Guilherme Caruso]]></dc:creator>
            <pubDate>Sun, 18 Nov 2018 18:05:36 GMT</pubDate>
            <atom:updated>2018-11-26T00:59:50.222Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*U93G0TMMvUZxf_eAdAr9Yg.png" /></figure><h4>Seja bem vindo ao tutorial #5 da GoSchool!</h4><p>Caso você tenha perdido o tutorial #4 sobre <strong>Operadores</strong>, segue o link:</p><p><a href="https://medium.com/gommunity/operadores-c7e1a41cfd4">#4 GoSchool: Operadores</a></p><p>Vamos falar sobre estrutura de controle e sua utilização nos mais diversos problemas do nosso dia a dia.</p><p>Estruturas de controle são responsáveis por definir determinadas ações, baseadas em critério lógicos. Essas ações por sua vez, podem definir um caminho correto para sua aplicação seguir, ou simplesmente, gerar um processo de repetição.</p><h3>- “Entendi, mas qual estrutura vamos controlar?”</h3><p>Para que o processo de estrutura de controle fique claro, vamos separar a lógica do nosso código em quatro etapas.</p><ul><li>Início</li><li>Decisão</li><li>Ação</li><li>Conclusão</li></ul><p>Agora, vamos transformar nossa lógica em um texto:</p><blockquote>“ Guilherme só consegue abrir a porta se estiver com a chave em mãos. Caso não a tenha, precisa busca-la no porta chaves.”</blockquote><p>Ótimo!</p><p>Com a nossa lógica definida, vamos abordar cada uma das etapas.</p><h4>Início</h4><ul><li>A primeira ação que nosso sujeito deve fazer é tentar abrir a porta.</li></ul><h4>Decisão ( 1 )</h4><ul><li>Ao girar a maçaneta, ele percebe que não esta com as chaves.</li></ul><h4>Ação ( 1 )</h4><ul><li>O sujeito então, busca a chave no porta chaves</li></ul><h4>Início</h4><ul><li>Ele volta até a etapa inicial e tenta abrir a porta.</li></ul><h4>Decisão ( 2 )</h4><ul><li>Agora com a chave em mãos, ele pode abrir a porta.</li></ul><h4>Ação ( 2 )</h4><ul><li>A porta é aberta.</li></ul><h4>Conclusão</h4><ul><li>O processo de abrir a porta é finalizado.</li></ul><h3>Vamos facilitar ainda mais?</h3><p>Aqui esta um fluxograma de todo o processo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/420/1*5IUBPvUlzCJA5y0nHTM7Yg.png" /></figure><p>Dessa forma, conseguimos perceber que uma estrutura de controle nada mais é, do que um processo de tomada de decisão, que tem como objetivo garantir que determinados critérios sejam cumpridos antes de uma ação ser tomada.</p><h4>Eu sei, eu sei, comecei a falar muito e explicar pouco. Pode deixar que agora a brincadeira vai começar.</h4><p>Os tópicos desse tutorial serão divididos da seguinte forma:</p><ol><li>If</li><li>Switch</li></ol><p>3. For</p><p>Cada um dos tópicos que serão abordados são fundamentais para que sua aplicação obedeça regras de negócio, garantindo como dito anteriormente, que cada ação seja tomada de maneira correta.</p><h3>1. IF</h3><p>O controle de fluxo mais utilizado em todas as linguagens de programação. Responsável por executar blocos de código, baseando-se inteiramente em operações lógicas.</p><p>Ao utilizarmos este controlador de fluxo, utilizamos três palavras chave:</p><ul><li>if - Critério “se” ;</li><li>else - Critério “senão” ;</li><li>else if - Critério “senão se”</li></ul><p>A estrutura de código para sua utilização é:</p><pre>&lt;Palavra chave&gt;  [Critério]  { //AÇÃO }</pre><h3>- “Blocos de código, se, senão, senão se ?”</h3><p>Vamos voltar ao exemplo apresentado no começo do tutorial:</p><blockquote>“ Guilherme só consegue abrir a porta se estiver com a chave em mãos. Caso não a tenha, precisa busca-la no porta chaves.”</blockquote><p>Analisando a frase e utilizando nossas palavras chave:</p><blockquote><strong>SE</strong> ele estiver com a chave, a porta pode ser aberta, <strong>SENÃO</strong>, ele deve buscar a chave no porta chaves.</blockquote><p><strong>Agora tudo começa a clarear!</strong></p><ul><li>Vamos verificar a ação, caso o nosso sujeito não tenha a chave.</li></ul><p>Aqui iniciamos uma variável como false , dando a entender que nosso sujeito não tinha a chave quando tentou abrir a porta.</p><pre>temChave := false</pre><pre>if temChave == true {</pre><pre>    fmt.Println(&quot;Porta aberta!&quot;)</pre><pre>} else {</pre><pre>   fmt.Println(&quot;Vá buscar a chave!&quot;)</pre><pre>}</pre><pre>//OUTPUT: Vá buscar a chave! </pre><p>Note que, verificamos se ele tinha a chave utilizando o critério if . Como passamos para o sistema que ele não a possuía, o critério else foi executado já que nosso controle principal temChave == true retornou false .</p><p>Podemos interpretar este código da seguinte forma:</p><blockquote><strong>SE</strong> temChave for igual a true , me informe que a porta pode ser aberta, <strong>SENÃO</strong>, me informe que preciso buscar as chaves.</blockquote><ul><li>Vamos checar o que aconteceria, se dessa vez, o usuário possuísse a chave.</li></ul><pre>temChave := true</pre><pre>if temChave == true {</pre><pre>   fmt.Println(&quot;Porta aberta!&quot;)</pre><pre>} else {</pre><pre>   fmt.Println(&quot;Vá buscar a chave!&quot;)</pre><pre>}</pre><pre>//OUTPUT: Porta aberta!</pre><p>Note que agora, o sistema não executou o bloco else , mas sim o bloco if ,</p><p>pois o critério de aceitação foi cumprido.</p><h3>- “Você comentou sobre if e else, mas onde esta o else if?”</h3><p>Vamos adicionar um grau maior de complexidade em nossa frase inicial, para que seja possível entendermos a utilização do else if .</p><blockquote>“ Guilherme só consegue abrir a porta se estiver com a chave em mãos. Caso não a tenha, pode tentar bater na porta para ver se existe alguém dentro do quatro. Se ninguém atender, ele deve buscar a chave no porta chaves.”</blockquote><p>Agora ganhamos um critério a mais no nosso processo de verificação, onde precisamos verificar mais de uma possibilidade para que a porta possa ser aberta.</p><p>Após a adição, nossa interpretação fica assim:</p><blockquote><strong>SE</strong> ele estiver com a chave, a porta pode ser aberta, <strong>SENÃO, SE </strong>ele bater na porta a mesma pode ser aberta, <strong>SENÃO</strong>, ele deve buscar a chave no porta chaves.</blockquote><p>Portanto, ficamos com o nosso código da seguinte forme:</p><pre>temChave := false<br>bateuNaPorta := true</pre><pre>if temChave == true {</pre><pre>   fmt.Println(&quot;Porta aberta com a chave!&quot;)</pre><pre>} else if bateuNaPorta == true {</pre><pre>  fmt.Println(&quot;Porta aberta ao bater nela!&quot;)</pre><pre>} else {</pre><pre>  fmt.Println(&quot;Vá buscar a chave!&quot;)</pre><pre>}</pre><pre>//OUTPUT: Porta aberta ao bater nela!</pre><p>Como colocamos a variável bateuNaPorta como true , ao verificar o critério else if o sistema rodou o bloco de código pertencente a ele.</p><h4>Vamos simplificar um pouquinho?</h4><p>Em GO, é possível iniciar variáveis ou executar funções de retorno (assunto que será abordado no tutorial #7) no momento da inicialização de um operador if.</p><p>A estrutura fica assim:</p><pre>&lt;Palavra chave&gt; [Inicialização]; [Critério]  { //AÇÃO }</pre><p>Vamos usar o primeiro exemplo abordado no tópico IF para detalharmos sua aplicação.</p><pre>if temChave:=true; temChave == true {</pre><pre>   fmt.Println(&quot;Porta aberta!&quot;)</pre><pre>} else {</pre><pre>   fmt.Println(&quot;Vá buscar a chave!&quot;)</pre><pre>}</pre><pre>//OUTPUT: Porta aberta!</pre><p>Note que de maneira direta, declaramos a variável e já aplicamos uma operação lógica de controle. Reduzindo o número de linhas, resumindo o escopo do código.</p><p>Entendido o nosso controlador if , vamos falar de um outro controlador muito utilizado. Estou falando do switch .</p><h3>2. Switch</h3><p>Diferente do controlador if , o switch tem como objetivo executar um bloco de código baseando-se na comparação de critérios do mesmo tipo.</p><p>Ao utilizarmos este controlador de fluxo, utilizamos três palavras chave:</p><ul><li>switch - Definição de critério ;</li><li>case - Critério a ser analisado;</li><li>default - Ação padrão caso nenhum critério seja aceito.</li></ul><p>A estrutura de código para sua utilização é:</p><pre>switch &lt;variavel a ser análisada&gt;{</pre><pre>case &lt;critério a ser análisado&gt;:</pre><pre>      //Código caso ele seja aceito.</pre><pre>default:</pre><pre>     //Código caso todos os &#39;cases&#39; sejam recusados.<br>}</pre><h3>- “Critérios do mesmo tipo?”</h3><p>Pense da seguinte forma:</p><blockquote>“Os produtos que custam R$10, são classificados como “Caros”. Os que custam R$5, classificados como “Populares”. Por fim, os que possuem valores diferentes, devem ser classificados como “Sem classificação”.</blockquote><p>Utilizando if nosso código ficaria assim:</p><pre>valorProduto := 5.00</pre><pre>if valorProduto == 10 {</pre><pre>   fmt.Println(&quot;Caros&quot;)</pre><pre>} else if valorProduto == 5 {</pre><pre>   fmt.Println(&quot;Populares&quot;)</pre><pre>} else {</pre><pre>   fmt.Println(&quot;Sem classificação&quot;)</pre><pre>}</pre><pre>//OUTPUT: Populares</pre><p>Nesse caso, precisamos verificar caso a caso, declarando um bloco de código com um validador lógico.</p><p>Com switch , deixamos nosso código assim:</p><pre>valorProduto := 5</pre><pre>switch valorProduto {</pre><pre>case 10:</pre><pre>   fmt.Println(&quot;Caros&quot;)</pre><pre>case 5:</pre><pre>   fmt.Println(&quot;Populares&quot;)</pre><pre>default:</pre><pre>   fmt.Println(&quot;Sem classificação&quot;)</pre><pre>}</pre><pre>//OUTPUT: Populares</pre><h4>Agora sim, tudo ficou claro!</h4><p>Ao declararmos o switch, definimos que o valor a ser analisado era do tipo int armazenado na variável valorProduto . A partir dessa definição, criamos todos os cases responsáveis por validar nossas afirmações. Com isso, nosso sistema comparou todos os casos e verificou que nosso valor se enquadrava no case, apresentando a mensagem “Populares” quando foi executado.</p><p>Agora que nossos controladores switch e if estão totalmente alinhados, podemos falar do último controlador, utilizado para a criação de processos de repetição. O controlador for .</p><h3>3. For</h3><h4>Enfim, chegamos ao controlador de repetição!</h4><p>O for tem como objetivo, executar uma sequência de repetição limitada ou não, de um bloco de código.</p><p>A estrutura de código para sua utilização é:</p><pre>for &lt;inicializador&gt;; &lt;controlador&gt;; &lt;incremento&gt; {}</pre><h3>- “Ainda não ficou claro…”</h3><p>Para facilitar o entendimento do for , vou separar a explicação em três aplicações práticas.</p><ul><li>Repetição;</li><li>Repetição com inicializador e incremento desassociado;</li><li>Repetição infinita.</li></ul><h3>Repetição</h3><p>Vamos utilizar o seguinte caso:</p><blockquote>Preciso fazer a contagem de 0 a 10, apresentando-a no console.</blockquote><p>Até agora, com o que aprendemos, nosso código ficaria assim:</p><pre>fmt.Println(1)<br>fmt.Println(2)<br>fmt.Println(3)<br>fmt.Println(4)<br>fmt.Println(5)<br>fmt.Println(6)<br>fmt.Println(7)<br>fmt.Println(8)<br>fmt.Println(9)<br>fmt.Println(10)</pre><pre>//OUTPUT: <br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10</pre><h4>Mas estamos falando de um controlador de repetição, onde o mundo se torna maravilhoso!</h4><p>Portanto, utilizando nosso controlador de repetição. O código anterior passa a ser:</p><pre>for contador := 1; contador &lt;= 10; contador ++ {</pre><pre>   fmt.Println(contador)</pre><pre>}</pre><pre>//OUTPUT: <br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10</pre><h3>- “Legal, mas o que aconteceu ai?”</h3><p>Vamos por partes:</p><ul><li>Logo após a declaração do for , a variável contador foi iniciada com o valor 1 .</li></ul><pre>for contador:=1</pre><ul><li>Após a inicialização da variável de controle, criamos o controlador, responsável por determinar quantas repetições serão feitas em nosso bloco de código. Nesse caso, informamos que ele deve ser executado até o momento em que a variável contador seja &lt;=10 .</li></ul><pre>for contador := 1; contador &lt;= 10</pre><ul><li>Por fim, adicionamos um “incrementador” para nossa variável contador . Ele é o responsável por adicionar +1 ao contador no final de cada repetição.</li></ul><pre>for contador := 1; contador &lt;= 10; contador++ </pre><p>Após essas etapas, estamos com nosso controlador de repetição for prontinho para ser utilizado.</p><h3>Repetição com inicializador e incremento desassociado</h3><p>Sua aplicação é semelhante a utilizada no for comum, a única diferença é que precisamos inicializar a variável de controle antes do bloco de repetição, e o incremento depois.</p><p>Dessa forma:</p><pre>contador := 1</pre><pre>for contador &lt;= 10 {</pre><pre>   fmt.Println(contador)<br>   contador ++</pre><pre>}</pre><pre>//OUTPUT: <br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10</pre><h4>Simples, rápido e indolor!</h4><p>Vamos para a última e menos recomendada prática dos laços de repetição.</p><h3>Repetição infinita</h3><p><strong><em>ATENÇÃO! MUITO ATENÇÃO! ATENÇÃO!</em></strong></p><p>Como o próprio nome diz, essa repetição não possui um ponto de parada, ou seja, seu código vai rodar, rodar, rodar e rodar.</p><p>Apenas para fins didáticos, a declaração desse controlador ocorre da seguinte forme:</p><pre>contador := 1</pre><pre>for {</pre><pre>  fmt.Println(contador)<br>  contador++</pre><pre>}</pre><pre>//OUTPUT:<br>1<br>2<br>3<br>.<br>.<br>.<br>Infinito</pre><p>De forma alguma estou dizendo que este processo não possa ser utilizado, contudo, sua aplicação deve ser muito bem pensada e planejada.</p><p><strong>EVITE REPETIÇÕES INFINITAS SEM PLANEJAMENTO!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/384/1*3EvOUZgpMiJFj-OalBYRag.jpeg" /></figure><h4>#FICADICA</h4><h3>Conclusão</h3><p>Chegamos ao fim de mais um tutorial da Gommunity.</p><p>Espero que a utilização das estruturas de controle tenha ficado bem claro, para que você possa tirar o máximo de proveito dessa prática no seu dia a dia, pessoal e profissional.</p><p>Nesse tutorial vimos:</p><ul><li>if - Critério “se” ;</li><li>else - Critério “senão” ;</li><li>else if - Critério “senão se”</li></ul><p>Nos vemos no próximo tutorial sobre <strong>Estruturas de Dados e seus métodos.</strong></p><p><a href="https://medium.com/gommunity/estrutura-de-dados-3bf942fbace1">#6 GoSchool: Estrutura de Dados e seus Métodos</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a558f5a51f08" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/estrutura-de-controle-a558f5a51f08">#5 GoSchool: Estruturas de Controle</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#4 GoSchool: Operadores]]></title>
            <link>https://medium.com/gommunity/operadores-c7e1a41cfd4?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/c7e1a41cfd4</guid>
            <category><![CDATA[golang-tools]]></category>
            <category><![CDATA[goschool]]></category>
            <category><![CDATA[golang-tutorial]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[golang-template]]></category>
            <dc:creator><![CDATA[Guilherme Caruso]]></dc:creator>
            <pubDate>Thu, 15 Nov 2018 22:20:51 GMT</pubDate>
            <atom:updated>2018-11-18T18:06:08.728Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*e9T1pa5vk6aHKMPITwDmCg.png" /></figure><h4>Seja bem vindo ao tutorial #4 da GoSchool!</h4><p>Caso você tenha perdido o tutorial #3 sobre <strong>Declarações e</strong> <strong>Tipos Primitivos</strong>, segue o link:</p><p><a href="https://medium.com/gommunity/3-goschool-declara%C3%A7%C3%B5es-e-tipos-6952dcc9fc0f">#3 GoSchool: Declarações e Tipos</a></p><p>Hoje, vamos falar de um assunto muito importante, que será utilizado em todos os desenvolvimentos em GO. Sim, estou falando dos <strong>Operadores.</strong></p><p>Toda e qualquer tarefa dentro de um algoritmo é feita utilizando operadores, que por sua vez, irá executar alguma ação baseada em seu tipo.</p><h3>- “Como assim, uma ação baseada em tipo?”</h3><p>Os principais tipos de operadores são:</p><ul><li>Aritméticos</li><li>Relacionais</li><li>Lógicos</li><li>Atribuição</li></ul><p>Cada tipo de operador é responsável por uma determinada operação. Alguns são popularmente conhecidos, dentro e fora da programação, como é o caso dos <strong>operadores aritméticos</strong>.</p><p><strong>Chega de enrolação e vamos colocar a mão na massa para entendermos os diferentes tipos de operadores.</strong></p><p>Vamos seguir a ordem da lista apresentada anteriormente, ok?</p><h3>1. Aritméticos</h3><p>Como citei anteriormente, <strong>operadores aritméticos</strong> são responsáveis pela realização de operações básicas de processamento, muitas vezes utilizadas em nosso cotidiano.</p><p>Em GO possuímos sete operadores aritméticos, que são:</p><ul><li>Soma +</li><li>Subtração -</li><li>Multiplicação *</li><li>Divisão /</li><li>Módulo (Resto da Divisão) %</li><li>Incremento ++</li><li>Decremento --</li></ul><h3>Soma ( + )</h3><p>Operação de “combinação” entre dois números.</p><pre>num1 := 4<br>num2 := 8<br>resultado := num1 + num2</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: 12</pre><h3>Subtração ( - )</h3><p>Operação de subtração entre dois números.</p><pre>num1 := 10<br>num2 := 5<br>resultado := num1 - num2</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: 5</pre><h3>Multiplicação ( * )</h3><p>Operação entre dois número que visa obter um resultado que representa a soma de uma quantidade finita de um mesmo número.</p><pre>num1 := 8<br>num2 := 3<br>resultado := num1 * num2</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: 24</pre><h3>Divisão ( / )</h3><p>Operação que visa obter um quociente a partir da divisão de dois números.</p><pre>num1 := 100<br>num2 := 10<br>resultado := num1 / num2</pre><pre>fmt.Prinln(resultado)</pre><pre>OUTPUT: 10</pre><h3>Módulo — Resto da Divisão ( % )</h3><p>Operação que visa obter um resto a partir da divisão de dois números.</p><pre>num1 := 17<br>num2 := 2<br>resultado := num1 % num2</pre><pre>fmt.Prinln(resultado)</pre><pre>OUTPUT: 1</pre><h3>Incremento ( ++ )</h3><p>Operador responsável por adicionar 1 à uma variável.</p><pre>num1 := 10<br>num1++</pre><pre>fmt.Println(num1)</pre><pre>OUTPUT: 11</pre><blockquote>++ é o mesmo que +1 .</blockquote><h3>Decremento ( -- )</h3><p>Operador responsável por remover 1 à uma variável.</p><pre>num1 := 20<br>num1--</pre><pre>fmt.Println(num1)</pre><pre>OUTPUT: 19</pre><blockquote>-- é o mesmo que <em>-1</em> .</blockquote><p>Operadores aritméticos são simples, já que fazem parte de tudo aquilo que praticamos dentro e fora do mundo da programação.</p><h3>2. Relacionais</h3><p>Operadores relacionais verificam uma expressão e retornam um valor boolean de aceitação true ou negação false .</p><p>São utilizados por todos os processos dentro de um algoritmo, já que ditam retornos de critérios lógicos.</p><p>Em GO possuímos seis principais operadores relacionais, que são:</p><ul><li>Comparação ==</li><li>Diferença !=</li><li>Maior &gt;</li><li>Menor &lt;</li><li>Maior ou igual &gt;=</li><li>Menor ou igual &gt;=</li></ul><h3>Comparação ( == )</h3><p>Verifica igualdade entre variáveis, retornando o status relacional de ambas.</p><pre>num1 := 5<br>num2 := 5<br>resultado := num1 == num2</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><blockquote>O processo de comparação é feito utilizando variáveis do mesmo tipo.</blockquote><h3>Diferença ( != )</h3><p>Verifica diferença entre variáveis, retornando o status relacional de ambas.</p><pre>num1 := 8<br>num2 := 15<br>resultado := num1 != num2</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><blockquote>O processo de diferença é feito utilizando variáveis do mesmo tipo.</blockquote><h3>Maior ( &gt; )</h3><p>Operador responsável por verificar, entre duas variáveis, se o primeiro argumento é maior que o segundo argumento.</p><pre>num1 := 30<br>num2 := 20<br>resultado := num1 &gt; num2<br>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><h3>Antes de continuar!</h3><p>Nos exemplos, estou utilizando apenas variáveis numéricas. Contudo, o processo de verificação pode ser feito utilizando qualquer tipo primitivo da linguagem, como strings, números e booleans.</p><p>Nas operações lógicas utilizando string, por exemplo, o comparativo é feito utilizando os valores decimais de cada caractere presente na tabela <a href="https://pt.wikipedia.org/wiki/ASCII">ASCII</a>.</p><p>Vale lembrar, que uma operação envolvendo soma de strings é válida e chamada de <strong>concatenação</strong>. Assunto abordado no tutorial sobre funções.</p><h3>Menor ( &lt; )</h3><p>Operador responsável por verificar, entre duas variáveis, se o primeiro argumento é menor que o segundo argumento.</p><pre>num1 := 10<br>num2 := 40<br>resultado := num1 &lt; num2<br>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><h3>Maior ou igual ( &gt;= )</h3><p>Operador responsável por verificar, entre duas variáveis, se o primeiro argumento é maior ou igual ao segundo argumento.</p><pre>num1 := 20<br>num2 := 20<br>resultado := num1 &gt;= num2<br>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><h3>Menor ou igual ( &lt;= )</h3><p>Operador responsável por verificar, entre duas variáveis, se o primeiro argumento é maior ou igual ao segundo argumento.</p><pre>num1 := 5<br>num2 := 20<br>resultado := num1 &lt;= num2<br>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><p>Operadores relacionais não possuem grandes segredos, já que realizam processos lógicos comparativos de forma rápida dentro de seu algoritmo.</p><p>Entendido o assunto de operadores relacionais, podemos utiliza-los em conjunto com um novo tipo de operador. Os <strong>operadores lógicos</strong>.</p><h3>3. Lógicos</h3><p>Como o nome já diz, são responsáveis por definir uma lógica baseada em critérios e valores relacionais.</p><h3>- “Legal, me fale mais sobre isso…”</h3><p>Operações lógicas tem como objetivo, o retorno de valores booleanos trueou false , que poderão ser utilizados em estruturas de controle (Assunto que será abordado no próximo tutorial).</p><p>Em GO possuímos três principais operadores lógicos, que são:</p><ul><li>Conjunção (E) &amp;&amp;</li><li>Disjunção (Ou) ||</li><li>Negação !=</li></ul><h3>Conjunção ( &amp;&amp; )</h3><p>Conjunção é a operação que possui o objetivo de “agregar” valores relacionais e verificar se os mesmos são condizentes à uma condição.</p><p><strong>Calma lá! Vamos melhorar essa explicação.</strong></p><p>Vamos utilizar a seguinte frase:</p><blockquote>Caruso e Esteves escrevem artigos sobre GO.</blockquote><p>Agora, vamos trata-los como variáveis:</p><pre>autor1 := &quot;Caruso&quot;<br>autor2 := &quot;Esteves&quot;</pre><p>Vamos adicionar um critério. Apenas uma ideia:</p><blockquote>“Só existem artigos sobre GO, se Caruso e Esteves forem os autores.”</blockquote><p>Beleza!</p><p>Agora que possuímos valores e um critério, conseguimos utilizar nosso operador lógico de conjunção junto com um operador relacional para obter um resultado lógico booleano.</p><pre>//Seguindo nosso critério</pre><pre>autor1 := &quot;Caruso&quot;<br>autor2 := &quot;Esteves&quot;<br>criterio := autor1 == &quot;Caruso&quot; &amp;&amp; autor2 == &quot;Esteves&quot;</pre><pre>fmt.Println(criterio)</pre><pre>OUTPUT: true</pre><blockquote>Repare que autor1 e autor2 satisfazem o critério que:<strong> Somente quando Caruso e Esteves estiverem juntos, o resultado será positivo</strong></blockquote><p>Note que, caso uma das variáveis não seja válida, o algoritmo retorna false .</p><pre>//Seguindo nosso critério</pre><pre>autor1 := &quot;Guilherme&quot;<br>autor2 := &quot;Esteves&quot;<br>criterio := autor1 == &quot;Caruso&quot; &amp;&amp; autor2 == &quot;Esteves&quot;</pre><pre>fmt.Println(criterio)</pre><pre>OUTPUT: false</pre><p>Em um operador lógico de conjunção, todos os critérios relacionais devem ser true .</p><h3>Disjunção ( || )</h3><p>Disjunção tem como objetivo verificar se um dos critérios relacionais é válido, gerando um resultado baseado na ordem de chamada.</p><h3>- “Ordem de chamada?”</h3><p>Um algoritmo é lido da esquerda para a direita, dessa forma, variáveis declaradas mais a esquerda são lidas e interpretadas antes das variáveis declaradas mais a direita.</p><h4>Ainda não ficou claro?</h4><p>Pense da seguinte forma:</p><p>Você precisa encontrar uma porta que esteja destrancada. Em um total de 4 portas, a primeira que você conseguir abrir, finaliza o seu processo de busca.</p><p>Dessa forma temos:</p><pre>Porta 1 || Porta 2 || Porta 3 || Porta 4</pre><ul><li>Você tenta acessar a porta 1 e percebe que ela esta trancada;</li><li>Verifica a porta de número 2 que também esta trancada;</li><li>Verificando a porta de número 3 ela se abre.</li></ul><p>Nesse momento, você não precisa verificar a porta 4, pois o critério lógico dizia que, ao encontrar a primeira porta aberta o processo seria finalizado.</p><p>Sendo assim, ao utilizarmos o operador lógico de disjunção || , estamos buscando em diversas variáveis relacionais, um único valor positivo para que nosso processo seja válido.</p><p>Veja o exemplo:</p><pre>relacional1 := 10 &gt; 30 //false<br>relacional2 := 20 == 18 //false<br>relacional3 := 18 &lt; 50 //true<br>relacional4 := 50 == 50 //true</pre><pre>resultado := relacional1 || relacional2 || relacional3 || relacional4</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><p>Note que as duas primeiras variáveis relacionais retornam false, e as duas últimas, true. Por mais que a quarta variável seja verdadeira, o sistema constatou que o resultado era true logo que verificou a terceira variável.</p><h3>Negação ( != )</h3><p>Negação pode também ser caracterizado como uma operador relacional, dessa forma, sua explicação é plausível para ambos os casos.</p><blockquote>Note que o <strong>operador lógico de negação</strong> possui as mesmas características que o <strong>operador relacional de diferença</strong>.</blockquote><p>O operador lógico de negação visa comparar variáveis, sejam elas tipos primitivos ou resultados relacionais, a fim de obter uma verdade quando se existe uma diferença.</p><p>De forma clara:</p><pre>nome1 := &quot;Guilherme&quot;<br>nome2 := &quot;Caruso&quot;<br>resultado := nome1 != nome2</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><p>ou</p><pre>relacional1 := 10 == 10 // true<br>relacional2 := 20 &lt; 10 // false<br>resultado := relacional1 != relacional2</pre><pre>fmt.Println(resultado)</pre><pre>OUTPUT: true</pre><p>Conseguimos comprovar que o operador lógico de negação se comporta da mesma forma para tipos primitivos e resultados relacionais.</p><h3>4. Atribuição</h3><p>Operadores de atribuição possibilitam que valores de variáveis sejam alterados de diversas formas.</p><p>Em GO possuímos seis principais operadores de atribuição, que são:</p><ul><li>Atribuição =</li><li>Soma e atribuição +=</li><li>Subtração e atribuição -=</li><li>Multiplicação e atribuição *=</li><li>Divisão e atribuição /=</li><li>Módulo e atribuição %=</li></ul><h3>Atribuição ( = )</h3><p>Utilizado para atribuir valor inicial ou sobrescrever um valor já existente de uma variável.</p><pre>var nome string = &quot;Guilherme&quot;</pre><p>ou</p><pre>nome := &quot;Guilherme&quot;<br>nome = &quot;Caruso&quot;</pre><pre>fmt.Println(nome)</pre><pre>OUTPUT: Caruso</pre><h3>Soma e atribuição ( += )</h3><p>Utilizado para efetuar somas e, no caso de strings, concatenações. Atribuindo à variável inicial um novo valor já processado.</p><ul><li>Numérico</li></ul><pre>numero := 20<br>numero += 10</pre><pre>fmt.Printf(&quot;%d&quot;, numero)</pre><pre>OUTPUT: 30</pre><ul><li>Texto (Concatenação)</li></ul><pre>nome := &quot;Guilherme&quot;<br>nome += &quot; Caruso&quot;</pre><pre>fmt.Println(nome)</pre><pre>OUTPUT: Guilherme Caruso</pre><h3>Subtração e atribuição ( -= )</h3><p>Utilizado para efetuar subtrações. Atribuindo à variável inicial um novo valor já processado.</p><pre>numero := 50<br>numero -= 10</pre><pre>fmt.Printf(&quot;%d&quot;, numero)</pre><pre>OUTPUT: 40</pre><h3>Multiplicação e atribuição ( *= )</h3><p>Utilizado para efetuar multiplicações . Atribuindo à variável inicial um novo valor já processado.</p><pre>numero := 20<br>numero *= 2</pre><pre>fmt.Printf(&quot;%d&quot;, numero)</pre><pre>OUTPUT: 40</pre><h3>Divisão e atribuição ( /= )</h3><p>Utilizado para efetuar divisões . Atribuindo à variável inicial o valor do quociente da divisão.</p><pre>numero := 30<br>numero /= 2</pre><pre>fmt.Printf(&quot;%d&quot;, numero)</pre><pre>OUTPUT: 15</pre><h3>Resto e atribuição ( %= )</h3><p>Utilizado para efetuar divisões . Atribuindo à variável inicial o valor do resto da divisão.</p><pre>numero := 17<br>numero %= 2</pre><pre>fmt.Printf(&quot;%d&quot;, numero)</pre><pre>OUTPUT: 1</pre><h3>Conclusão</h3><p>Entendendo todos os nossos principais operadores, começamos a ter uma visão cada vez melhor da linguagem. Podemos enxergar possibilidades e aplicações de GO em operações muitas vezes repetitivas do nosso cotidiano.</p><p>Nesse tutorial vimos:</p><ul><li>Operadores aritméticos;</li><li>Operadores relacionais;</li><li>Operadores lógicos;</li><li>Operadores de atribuição.</li></ul><p>Nos vemos no próximo post sobre estruturas de controle!</p><p><a href="https://medium.com/gommunity/estrutura-de-controle-a558f5a51f08">#5 GoSchool: Estruturas de Controle</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c7e1a41cfd4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/operadores-c7e1a41cfd4">#4 GoSchool: Operadores</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#3 GoSchool: Declarações e Tipos Primitivos]]></title>
            <link>https://medium.com/gommunity/3-goschool-declara%C3%A7%C3%B5es-e-tipos-6952dcc9fc0f?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/6952dcc9fc0f</guid>
            <category><![CDATA[golang-template]]></category>
            <category><![CDATA[goschool]]></category>
            <category><![CDATA[golang-tutorial]]></category>
            <category><![CDATA[golang-tools]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Guilherme Caruso]]></dc:creator>
            <pubDate>Tue, 13 Nov 2018 18:35:53 GMT</pubDate>
            <atom:updated>2018-11-15T22:52:57.852Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*ZqHKCigZsap5h_wber39Eg.png" /></figure><p>Seja bem vindo ao tutorial de número #3, onde iremos falar sobre declarações e tipos da linguagem.</p><p>Caso você tenha perdido o #2 sobre Estrutura Básica, segue o link:</p><p><a href="https://medium.com/gommunity/2-goschool-estrutura-b%C3%A1sica-9ce3e6b5fa27">#2 GoSchool : Estrutura Básica</a></p><p>O material do tutorial será dividido da seguinte forma:</p><ol><li>Declarações</li></ol><ul><li>Variável</li><li>Constante</li></ul><p>2. Tipos Primitivos</p><p>Tenha em vista que após esse tutorial, você estará preparado para começar a desbravar pequenos projetos na linguagem.</p><p><strong>VAMOS LÁ!</strong></p><h3>1. Declarações</h3><h3>Variáveis</h3><p>Variáveis são nossas companheiras durante todo e qualquer desenvolvimento, já que são responsáveis por iniciar, armazenar e disponibilizar qualquer tipo de informação.</p><p>Há diversas formas possíveis para se declarar uma <strong>variável</strong>, algumas delas são:</p><ul><li>Declaração explícita</li></ul><pre>var nomeDaVariavel tipo</pre><blockquote>Dessa forma declaramos de forma explicita o nome da variável e o seu “tipo” sem um valor definido. O valor por sua vez, é definido baseado no tipo da variável, mais adiante abordaremos este assunto.</blockquote><ul><li>Declaração explicita com valor definido</li></ul><pre>var nomeDaVariavel tipo = valorDaVariavel</pre><blockquote>Dessa forma, iniciamos uma variável e já atribuimos um valor ao mesmo tempo. Vale lembrar que a partir do momento que um tipo é definido para uma variável, ele não irá aceitar valores de tipagem diferente.</blockquote><p>Para os preguiçosos de plantão, a linguagem também permite iniciarmos mais de uma <strong>variável</strong> ao mesmo tempo, atribuindo ou não valores à ela.</p><ul><li>Declaração explícita — Declaração múltipla</li></ul><pre>var nomeVar1, nomeVar2 tipo</pre><blockquote>O único detalhe é que esse tipo de declaração define o mesmo “tipo”para as diferentes variáveis, sendo proibido definir mais de um “tipo”.</blockquote><ul><li>Declaração explícita com valor definido — Declaração múltipla</li></ul><pre>var nomeVar1, nomeVar2 tipo = valor1, valor2</pre><p>Um detalhe bem bacana, é que a linguagem permite que você inicie uma nova variável sem a necessidade de declarar de forma explicita o seu “tipo”, dessa forma, ela se torna a responsável por identificar a definir essa informação. O único detalhe é que esse suporte só ocorre para declarações com valores já definidos.</p><ul><li>Declaração implícita com valor definido;</li></ul><pre>var nomeVar = valor1</pre><ul><li>Declaração implícita com valor definido — Declaração múltipla</li></ul><pre>var nomeVar, nomeVar2 = valor, valor2</pre><h3>- “Você falou que a linguagem era fácil… tenho que escrever muito!”</h3><p>Muita calma nessa hora padawan, deixei a cereja do bolo de <strong>variáveis</strong> para o final!</p><p>Como GO possui sintaxe semelhante a linguagem de programação C, algumas de suas características foram “herdadas”. A mais utilizada, na minha opinião, a mais “bonita”, é a declaração reduzida de variáveis que é feita utilizando <strong>:= </strong>, sim, apenas isso.</p><ul><li>Declaração implícita reduzida</li></ul><pre>nomeVar := valor</pre><ul><li>Declaração implícita reduzida — Declaração múltipla</li></ul><pre>nomeVar, nomeVar2 := valor, valor2</pre><blockquote>Esse tipo de declaração, diferente do tipo explícito, permite que você declare ao mesmo tempo diferentes tipos de variáveis.</blockquote><p>Esse tipo de declaração só pode ser utilizado em um escopo de função, causando erro de compilação caso seja declarada de outra forma.</p><pre>package main</pre><pre>i := valor</pre><pre>func main() {</pre><pre>}</pre><blockquote>O modelo acima irá gerar um erro de compilação</blockquote><pre>package main</pre><pre>func main() {</pre><pre>i := valor</pre><pre>}</pre><blockquote>o modelo acima apresenta uma declaração correta</blockquote><p>Por fim, ao utilizarmos a declaração reduzida, qualquer alteração no valor da <strong>variável</strong> deve ser feito utilizando símbolo de igualdade <strong>=</strong>, já que <strong>:=</strong> representa a inicialização de uma nova variável.</p><pre>variavel := valor  // valor</pre><pre>variavel = novoValor // novoValor</pre><p><strong>Muita calma nessa hora, pois existe mais uma forma de declararmos múltiplas variáveis!</strong></p><p>Anteriormente comentei sobre a declaração múltipla em linha, ou seja:</p><pre>variavel, variavel2 := 1, 2</pre><p>Esse tipo de declaração facilita o processo de criação, contudo, possuímos uma forma ainda mais agradável de declararmos múltiplas <strong>variáveis</strong> de forma implícita ou explícita.</p><ul><li>Declaração explícita aninhada — Declaração múltipla</li></ul><pre>var (</pre><pre>variavel tipo = valor<br>   variavel2 tipo = valor<br>   variavel3 tipo = valor</pre><pre>)</pre><ul><li>Declaração implícita aninhada — Declaração múltipla</li></ul><pre>var (</pre><pre>variavel = valor<br>   variavel2 = valor<br>   variavel3 = valor</pre><pre>)</pre><p>Chegamos ao fim da explicação sobre <strong>variáveis</strong>!</p><p>Aos poucos vamos nos adaptando com sua utilização fazendo com que a sua escrita seja feita de forma quase automática.</p><h3>Constantes</h3><p>Saindo do maravilhoso mundo das variáveis, chegamos no não tão belo mundo das <strong>constantes</strong>.</p><h3>- “Mas qual o motivo de não ser tão belo?”</h3><p>O único motivo para essa frase é que como o próprio nome já diz, as <strong>constantes</strong> devem nascer com um valor já definido e em momento algum possuem seus valores alterados.</p><p>A sua declaração é semelhante a utilizada nas variáveis, ficando da seguinte forma:</p><ul><li>Declaração explícita</li></ul><pre>const nomeConstante tipo = valorConstante</pre><blockquote>Ao ser inicializado, deve possuir seu valor final definido.</blockquote><ul><li>Declaração implícita</li></ul><pre>const nomeConstante = valorconstante</pre><blockquote>Semelhante a variável, o tipo da constante não precisa ser explícito.</blockquote><p>Por fim, podemos declarar <strong>constantes</strong> de forma aninhada.</p><ul><li>Declaração explícita aninhada — Declaração múltipla</li></ul><pre>const (</pre><pre>constante tipo = valor<br>   constante2 tipo = valor<br>   constante3 tipo = valor</pre><pre>)</pre><ul><li>Declaração implícita aninhada — Declaração múltipla</li></ul><pre>constante (</pre><pre>constante = valor<br>   constante2 = valor<br>   constante3 = valor</pre><pre>)</pre><p>Essa etapa foi bem rápida, já que as <strong>constantes</strong> não possuem declarações reduzidas ou “firulas” bonitinhas 😃.</p><p><strong>Chegamos ao fim das declarações!</strong></p><p>Podemos iniciar o assunto relacionado aos <strong>tipos primitivos</strong> da linguagem que tanto comentamos anteriormente.</p><h3>2. Tipos primitivos</h3><p>A partir de agora vamos abordar os tipos primitivos utilizados na linguagem GO.</p><blockquote>Um tipo primitivo representa o nível mais baixo de declaração de um valor, podendo atuar como um texto, número ou booleano.</blockquote><h3>String</h3><p>O tipo <strong>String </strong>é o responsável por representar valores de texto. Sim, simples e direto.</p><p>Uma curiosidade a respeito da utilização de textos na linguagem GO, é que a mesma utiliza codificação binária <strong>UTF-8</strong> Para saber mais sobre <strong>UTF-8</strong> acesse <a href="https://pt.wikipedia.org/wiki/UTF-8">AQUI!</a></p><h3>- “Tá, mas como posso declarar uma String?”</h3><p>A declaração de uma <strong>String </strong>pode ser feita de duas formas:</p><ul><li>Aspas duplas &quot;...&quot;</li></ul><pre>novaString := &quot;Essa é uma nova String&quot;</pre><ul><li>Backticks `...`</li></ul><pre>novaString := `Essa é uma nova String`</pre><p>Um detalhe a respeito da utilização do <em>backtick, </em>é que ele permite uma quebra de linha durante a sua declaração.</p><pre>novaString := `Essa é <br>                 uma nova String`</pre><p>Caso queira declarar uma <strong>String</strong> de forma explícita, é possível utilizar a seguinte sintaxe:</p><pre>var novaString string</pre><pre>novaString = &quot;Oi&quot;</pre><p>Agora que você já possui conhecimento sobre a utilização de <strong>String</strong>, podemos falar de um outro tipo muito utilizado, o <strong>Boolean</strong>.</p><h3>Boolean</h3><p>O tipo <strong>boolean</strong> é responsável por definir o valor de uma variável como true (verdadeiro) ou false (falso). Diferente de outras linguagens de programação, em GO, um <strong>boolean</strong> não pode ser representado por números ,0 e 1, por exemplo.</p><p>A declaração de um <strong>boolean</strong> é feita seguindo o padrão:</p><pre>var novoBooleano bool</pre><pre>novoBooleano = true</pre><p>Vale ressaltar que também que é possível declarar um <strong>boolean</strong> de forma reduzida.</p><pre>novoBoolean := false</pre><p>Por padrão, quando declaramos um <strong>boolean</strong> e não definimos um valor inicial para ele, o mesmo passa a ter false como seu valor.</p><p><strong>Ok, a utilização do boolean pode ser um pouco abstrata nesse momento, mas nas próximas aulas veremos o seu verdadeiro potencial em prática!</strong></p><h3>Tipos numéricos</h3><p>Enfim, chegamos aos tipos numéricos que, assim como o nome diz, representam todo e qualquer tipo de variável contendo números.</p><p>A lista é um pouco extensa, mas logo tudo ficará bem claro.</p><pre>╔═════════╦══════════════════════════════════════════════════════╗<br>║   Tipo  ║                        Faixa                         ║<br>╠═════════╬══════════════════════════════════════════════════════╣                        <br>║ rune    ║-2,147,483,648 ~ 2,147,483,647                        ║                       <br>║ int8    ║-128 ~ 127                                            ║                       <br>║ int16   ║-32,768 ~ 32,767                                      ║<br>║ int32   ║-2,147,483,648 ~ 2,147,483,647                        ║<br>║ int64   ║-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807║       <br>║ byte    ║ 0 ~ 255                                              ║<br>║ uint8   ║ 0 ~ 255                                              ║<br>║ uint16  ║ 0 ~ 65,535                                           ║<br>║ uint32  ║ 0 ~ 4,294,967,295                                    ║<br>║ uint64  ║ 0 ~ 18,446,744,073,709,551,615                       ║<br>║ float32 ║ -3.4^38 ~ +3.4^38                                    ║<br>║ float64 ║ -1.7^308 to +1.7^308                                 ║<br>╚═════════╩══════════════════════════════════════════════════════╝</pre><blockquote>Podemos notar que <em>rune</em> possui as mesmas características de um <em>int32</em> , assim como um <em>byte</em> esta para <em>uint8</em> .</blockquote><p>Além dos tipos apresentados na tabela, existem outros dois que apresentarei de forma breve devido ao seu nível de complexidade.</p><p>Estou falando do complex64 e complex128</p><h3>- “Tudo bem. Uma dúzia de tipos e valores, mas como realmente podemos utiliza-los? ”</h3><p>Vou separar a explicação em três etapas para que seja possível iniciarmos de forma descomplicada.</p><ol><li>Inteiros</li><li>Fracionários</li><li>Complexos</li></ol><h3>Inteiros</h3><blockquote>“Os <strong>números inteiros</strong> são constituídos dos números naturais e seus simétricos negativos, incluindo o zero.”</blockquote><p>Dentro dos<strong> inteiros simétricos</strong> possuímos os <strong>seguintes</strong> tipos:</p><pre>╔═════════╦══════════════════════════════════════════════════════╗<br>║   Tipo  ║                        Faixa                         ║<br>╠═════════╬══════════════════════════════════════════════════════╣                        <br>║ rune    ║-2,147,483,648 ~ 2,147,483,647                        ║                       <br>║ int8    ║-128 ~ 127                                            ║                       <br>║ int16   ║-32,768 ~ 32,767                                      ║<br>║ int32   ║-2,147,483,648 ~ 2,147,483,647                        ║<br>║ int64   ║-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807║       <br>╚═════════╩══════════════════════════════════════════════════════╝</pre><p>A única grande diferença entre eles está na capacidade de bytes que cada tipo suporta.</p><h3>- “Já falou muita coisa. Como posso utiliza-los?”</h3><p>A declaração explícita de <strong>inteiros simétricos</strong> é bem simples.</p><pre>var runeVar rune = 255<br>var intVar int8 = 100<br>var intVar2 int16 = -300<br>var intVar3 int32 = 1000<br>var intVar4 int64 = -10000</pre><blockquote>A declaração de qualquer tipo de número, diferente dos textos, não necessita da utilização de <em>&quot;&quot;</em> ou <em>``</em> .</blockquote><p>Ainda sobre <strong>inteiros</strong>, existem os que possuem capacidade apenas, para valores positivos.</p><pre>╔═════════╦══════════════════════════════════════════════════════╗<br>║   Tipo  ║                        Faixa                         ║<br>╠═════════╬══════════════════════════════════════════════════════╣                        <br>║ byte    ║ 0 ~ 255                                              ║<br>║ uint8   ║ 0 ~ 255                                              ║<br>║ uint16  ║ 0 ~ 65,535                                           ║<br>║ uint32  ║ 0 ~ 4,294,967,295                                    ║<br>║ uint64  ║ 0 ~ 18,446,744,073,709,551,615                       ║<br>╚═════════╩══════════════════════════════════════════════════════╝</pre><p>O processo de declaração explícita continua idêntico ao descrito anteriormente.</p><pre>var byteVar byte = 20<br>var uintVar uint8 = 20<br>var uintVar2 uint16 = 100<br>var uintVar3 uint32 = 1233<br>var uintVar4 uint64 = 12313</pre><h3>- “Você falou que GO era fácil!”</h3><p>Claro que GO é uma linguagem fácil!</p><p>Caso a declaração não seja explícita, nosso querido e amado GO se encarrega de solucionar este problema.</p><p><strong><em>Atenção: O código abaixo irá demonstrar apenas o processo de identificação automático da linguagem. Não se preocupe em entendê-lo agora.</em></strong></p><pre>package main</pre><pre>import (</pre><pre>&quot;fmt&quot;</pre><pre>&quot;reflect&quot;</pre><pre>)</pre><pre>func main() {</pre><pre>variavelInteira := -2000</pre><pre>fmt.Println(reflect.TypeOf(variavelInteira))</pre><pre>}</pre><pre>// OUTPUT: int</pre><p>A variável foi interpretada e automaticamente definida como int, algo que pode ocorrer com qualquer outro <strong>tipo numérico</strong>.</p><p>Agora que conhecemos todos os tipos de inteiros, vamos falar dos <strong>fracionários,</strong> que garantem um pouco mais de liberdade durante sua utilização.</p><h3>Fracionários</h3><blockquote>“ Fração é um modo de expressar uma quantidade a partir de um valor que é dividido por um determinado número de partes iguais entre si. Número fracionário expressa esta condição. ”</blockquote><p>Todo e qualquer número representado por uma fração de um valor. Os tipos utilizados em GO, são:</p><pre>╔═════════╦══════════════════════════════════════════════════════╗<br>║   Tipo  ║                        Faixa                         ║<br>╠═════════╬══════════════════════════════════════════════════════╣                        <br>║ float32 ║ -3.4^38 ~ +3.4^38                                    ║<br>║ float64 ║ -1.7^308 to +1.7^308                                 ║<br>╚═════════╩══════════════════════════════════════════════════════╝</pre><p>Sua declaração explícita é semelhante a utilizada anteriormente, contudo, a fração de seu valor deve ser representada através de um . .</p><pre>var variavelFloat float32 = 15.50<br>var variavelFloat2 float64 = 35.588</pre><p>Podemos deixar mais uma vez a responsabilidade de definição de tipos com o GO.</p><p><strong><em>Atenção: O código abaixo irá demonstrar apenas o processo de identificação automático da linguagem. Não se preocupe em entendê-lo agora.</em></strong></p><pre>package main</pre><pre>import (</pre><pre>&quot;fmt&quot;</pre><pre>&quot;reflect&quot;</pre><pre>)</pre><pre>func main() {</pre><pre>num1 := 5.5</pre><pre>fmt.Println(reflect.TypeOf(num1))</pre><pre>}</pre><pre>// OUTPUT: float64</pre><p><strong>ENFIM CHEGAMOS AO ÚLTIMO TÓPICO DESTE TUTORIAL!</strong></p><h3>Complexos</h3><p>Comentei anteriormente que este seria um tópico rápido e sem muitos detalhes, já que seu nome representa a dificuldade de utiliza-lo.</p><p>De forma direta, um <strong>número complexo </strong>é representado através da fórmula complexa a + bi onde a,b são números reais e i é o resultado da equação i² = -1 , já que o seu valor final não pode ser representada por um número real.</p><p>Por convenção:</p><ul><li>i é denominado de <strong>número imaginário</strong></li><li>a é denominado de <strong>parte real</strong></li><li>bi é denominado de <strong>parte imaginária</strong></li></ul><blockquote>Os números complexos deram origem ao teorema <a href="https://en.wikipedia.org/wiki/Fundamental_theorem_of_algebra"><strong>fundamental da álgebra</strong></a></blockquote><h3>- “ ????? ”</h3><p>Para prender sua atenção nesse momento final, veja como os fractais criados e estudados através de números complexos são lindos!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yVwvFDl3EOFRKGE_piCmfg.jpeg" /></figure><p>complex64 e complex128 são os tipos complexos existentes em GO.</p><p>Sua declaração é idêntica a utilizada nos inteiros e fracionários.</p><pre>var complexo complex64 = 1+2i<br>var complexo2 complex128 = 10+4i</pre><blockquote>Como a utilização de complexos é restrita a cálculos avançados e “diferenciados”, GO disponibiliza de forma nativa um pacote contendo funções já prontas para sua utilização. Caso queira saber mais sobre esse pacote, <a href="https://golang.org/pkg/math/cmplx/">ACESSE</a>!</blockquote><p>Preciso ressaltar que <strong>números complexos</strong> possuem utilização muito específica. Com isso, caso você não entenda sobre sua utilização, fique tranquilo que isso não terá impacto algum na sua performance daqui pra frente! <strong>#VocêÉoMelhor</strong></p><h3>CHEGAMOS AO FIM !!!!!</h3><p>Após essa longa jornada, finalmente chegamos ao fim.</p><p>Espero que de alguma forma, você tenha absorvido e compreendido esse dois tópicos que serão a base para todo e qualquer desenvolvimento a partir de agora.</p><p>Nesse tutorial vimos:</p><ul><li>Declarações de variáveis e constantes;</li><li>Definição de todos os tipos primitivos da linguagem.</li></ul><p>Nos vemos no próximo post sobre operadores!</p><p><a href="https://medium.com/gommunity/operadores-c7e1a41cfd4">#4 GoSchool: Operadores</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6952dcc9fc0f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/3-goschool-declara%C3%A7%C3%B5es-e-tipos-6952dcc9fc0f">#3 GoSchool: Declarações e Tipos Primitivos</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#2 GoSchool : Estrutura Básica]]></title>
            <link>https://medium.com/gommunity/2-goschool-estrutura-b%C3%A1sica-9ce3e6b5fa27?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/9ce3e6b5fa27</guid>
            <category><![CDATA[golang-tutorial]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[golang-tools]]></category>
            <category><![CDATA[goschool]]></category>
            <category><![CDATA[golang]]></category>
            <dc:creator><![CDATA[Guilherme Caruso]]></dc:creator>
            <pubDate>Mon, 12 Nov 2018 15:21:22 GMT</pubDate>
            <atom:updated>2018-11-13T19:46:50.432Z</atom:updated>
            <content:encoded><![CDATA[<h3>#2 GoSchool: Estrutura Básica</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*86C_5bcapaof1QbXEz7bKg.png" /></figure><p>Bem vindo ao tutorial de número <strong>#2</strong> do GoSchool!</p><p>Caso você tenha perdido, aqui está o primeiro tutorial:</p><p><a href="https://medium.com/gommunity/1-goschool-instala%C3%A7%C3%A3o-dcf0a7940c6d">#1 GoSchool : Instalação</a></p><p>Vamos entender como funciona a estrutura básica de código da linguagem GO.</p><blockquote><strong><em>Obs:</em></strong><em> Os exemplos aqui apresentados podem ser escritos e executados em qualquer sistema operacional e editor de texto.</em></blockquote><h3>Criando o projeto</h3><p>Por padrão, a criação de projetos deve ocorrer dentro da pasta src definida em nosso GOPATH. Mais pra frente entrarei em detalhes sobre a estrutura de importação e utilização de bibliotecas.</p><p>Nesse primeiro momento, utilize a seguinte sequência de códigos:</p><pre>$ cd $GOPATH <br>$ cd src/<br>$ mkdir github.com <br>$ cd github.com/<br>$ mkdir &lt;Seu usuario GIT&gt;<br>$ cd &lt;Seu usuario GIT&gt;<br>$ mkdir &lt;Nome do seu Projeto&gt;</pre><p>Criada a pasta do seu projeto, agora podemos abri-la com um editor de texto para que possamos iniciar nosso tutorial.</p><ul><li><strong>Estrutura do projeto</strong></li></ul><p>Vamos utilizar a seguinte estrutura de pastas para esse tutorial.</p><pre>&lt;Nome do seu Projeto&gt;<br>|<br>└── main.go</pre><p>Crie ou utilize o comando abaixo dentro da pasta do seu projeto.</p><pre>$ touch main.go</pre><ul><li><strong>Entendendo o arquivo main.go</strong></li></ul><p>Dentro de seus requisitos, GO solicita que qualquer programa tenha sua função principal declarada. Em outras palavras, tudo que acontece deve e irá partir de uma função “main” de seu código.</p><p>Como o foco desse segundo tutorial não são declarações e tipos da linguagem, irei abordar o assunto de forma direta, porém, nos próximos tutoriais trarei mais detalhes a respeito disso.</p><ul><li>Uma função em GO é declarada da seguinte forma</li></ul><pre>func &lt;nomeDaFuncao&gt;() {<br>        //&lt;TODO&gt;<br>}</pre><p>Sendo assim, para que possamos declarar uma função main dentro de nosso arquivo main.go devemos escreve-la da seguinte forma:</p><pre>func main() {<br>        //&lt;TODO&gt;<br>}</pre><p>Agora, toda e qualquer ação do nosso sistema irá ser chamado a partir dessa função.</p><h3>- “Só isso?”</h3><h3>- “Posso rodar meu código?”</h3><p>Estamos quase lá, mas ainda é necessário preparar um pouco mais o nosso terreno para que GO possa rodar sem nenhum problema, mostrando todo o seu potêncial.</p><p>Assim como nossa função principal, precisamos declarar também nosso pacote principal pois sem ele a mágica não acontece.</p><p>Para declararmos o pacote principal, dentro do arquivo main.go definimos na parte inicial do arquivo o seguinte código:</p><pre>package main</pre><p>Dessa forma, nosso código até o momento está assim:</p><pre>package main</pre><pre>func main() {<br>    //&lt;TODO&gt;<br>}</pre><p>Bem, até aqui já verificamos os dois principais requisitos para qualquer desenvolvimento GO.</p><ul><li>Criação da função “main”;</li><li>Definição do pacote principal.</li></ul><p>O detalhe final para qualquer programa GO rodar sem nenhum problema são as suas importações. Elas definem e disponibilizam funções para utilizarmos dentro do nosso sitema.</p><ul><li><strong>Entendendo Imports</strong></li></ul><p>GO conta com uma série de funções já estabelecidas em seu core, podendo ser acessado e estudado a qualquer momento em sua documentação oficial <a href="https://golang.org/pkg/">AQUI!</a></p><p>Por se tratarem de pacotes nativos da linguagem, qualquer utilização de suas funções será de forma automática reconhecida pelo compilador da linguagem.</p><p><strong>Vamos parar de enrolar!</strong></p><p>Um dos primeiros passos de qualquer linguagem é o famoso <strong>“Hello World”</strong>, sendo assim, para que seja possível printar uma mensagem no console quando o programa for executado, devemos utilizar o seguinte pacote:</p><ul><li><a href="https://golang.org/pkg/fmt/">fmt</a></li></ul><p>O pacote responsável por formatar qualquer entrada ou saida de informação deve ser importado dentro do nosso arquivo <strong>main.go</strong>, para que suas funções sejam disponibilizadas.</p><p>Para importarmos uma biblioteca nativa da linguagem, devemos declará-la da seguinte forma:</p><pre>import &quot;fmt&quot;</pre><p>Vale lembrar que ela deve ser escrita abaixo da declaração do pacote e acima da função, deixando o código da seguinte forma:</p><pre>package main</pre><pre>import &quot;fmt&quot;</pre><pre>func main() {<br>    //&lt;TODO&gt;<br>}</pre><p><strong>- “Mas onde está o meu Hello World?”</strong></p><ul><li>Ao utilizarmos o pacote <strong>fmt</strong>, uma das funções disponibilizadas é o <strong>Println </strong>(abreviação de Print line), que permite a “impressão” de um texto no console. Com isso:</li></ul><pre>package main </pre><pre>import &quot;fmt&quot;</pre><pre>func main() {</pre><pre>    fmt.Println(&quot;Hello World&quot;)</pre><pre>}</pre><ul><li>Agora se acessarmos o local de nosso arquivo <strong>main.go</strong> e rodarmos o comando abaixo, teremos como resposta o nosso querido e amado “Hello World”:</li></ul><pre>$ go run main.go<br>//Hello World</pre><h3>Conclusão</h3><p>Enfim, com nosso Hello World em mãos podemos estudar tipos e conceitos da linguagem.</p><p>Nesse tutorial vimos:</p><ul><li>Criação da função “main”;</li><li>Definição do pacote principal;</li><li>Importação de pacotes nativos</li></ul><p>Nos vemos no próximo tutorial!</p><p><a href="https://medium.com/gommunity/3-goschool-declara%C3%A7%C3%B5es-e-tipos-6952dcc9fc0f">#3 GoSchool: Declarações e Tipos</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9ce3e6b5fa27" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/2-goschool-estrutura-b%C3%A1sica-9ce3e6b5fa27">#2 GoSchool : Estrutura Básica</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#1 GoSchool : Instalação]]></title>
            <link>https://medium.com/gommunity/1-goschool-instala%C3%A7%C3%A3o-dcf0a7940c6d?source=rss----be3bc55ebe06---4</link>
            <guid isPermaLink="false">https://medium.com/p/dcf0a7940c6d</guid>
            <category><![CDATA[golang-tutorial]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[golang-template]]></category>
            <category><![CDATA[golang-tools]]></category>
            <category><![CDATA[goschool]]></category>
            <dc:creator><![CDATA[Guilherme Caruso]]></dc:creator>
            <pubDate>Mon, 12 Nov 2018 13:18:58 GMT</pubDate>
            <atom:updated>2018-11-21T12:03:38.523Z</atom:updated>
            <content:encoded><![CDATA[<h3><a href="https://medium.com/p/dcf0a7940c6d?source=your_stories_page---------------------------">#1 GoSchool: Instalação</a></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*o8NFNC9bpaUb51IvPxh0jg.png" /></figure><p>Bem vindo ao tutorial de número <strong>#1</strong> do GoSchool, uma iniciativa da Gommunity.</p><p>Nesse primeiro momento vamos preparar o ambiente para que você possa utilizar GO em sua máquina. O processo de instalação será feito para <strong>Windows</strong>, <strong>Linux</strong> e <strong>macOS.</strong></p><blockquote><strong><em>Obs:</em></strong><em> Existem formas e formas de se instalar GO, caso encontre alguma diferente da apresentada neste tutorial, compartilhe com a gente</em></blockquote><blockquote>Para ter acesso ao material oficial de instalação do GO entre <a href="https://golang.org/doc/install">AQUI</a>!</blockquote><h3>Chega de enrolação!</h3><p>Vamos seguir essa ordem, Ok?</p><ol><li>Windows</li><li>Linux</li><li>macOS</li></ol><h3>Windows</h3><ol><li>Para iniciar o processo de instalação no Windows você deve acessar o link: <a href="https://golang.org/dl/">Download GO — Microsoft Windows</a></li><li>Clique no botão para download e aguarde o processo ser finalizado.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/0*RlOC0E-UOeXjqP3l" /></figure><p>3. Por estarmos dentro do Windows, não existem muitos segredos. Basta pressionar o botão “Next” até que o botão “Install” apareça. Com isto, o processo de instalação do Go estará finalizado no Windows.</p><blockquote>Vamos realizar um teste simples para ver se a instalação foi feita com sucesso! Explicarei em um próximo post um trecho de código mais elaborado para executarmos e realizarmos o teste de instalação, tudo bem?</blockquote><p>4. Agora precisamos definir o folder que apontado durante a instalação. Para isso, rode o seguinte comando:</p><pre>cd $HOME &amp;&amp; mkdir go &amp;&amp; cd go &amp;&amp; mkdir bin &amp;&amp; mkdir src &amp;&amp; mkdir pkg &amp;&amp; echo &#39;Gopath Definido&#39;</pre><p>5. Para testar se o GO realmente foi instalado em sua máquina, abra seu terminal e digite:</p><pre>go</pre><ul><li>A saída deve ser algo parecido com:</li></ul><pre>Go is a tool for managing Go source code.</pre><pre>Usage:</pre><pre>go &lt;command&gt; [arguments]</pre><pre>The commands are:</pre><pre>bug         start a bug report<br>build       compile packages and dependencies<br>clean       remove object files and cached files<br>doc         show documentation for package or symbol<br>env         print Go environment information<br>fix         update packages to use new APIs<br>fmt         gofmt (reformat) package sources<br>generate    generate Go files by processing source<br>get         download and install packages and dependencies<br>install     compile and install packages and dependencies<br>list        list packages or modules<br>mod         module maintenance<br>run         compile and run Go program<br>test        test packages<br>tool        run specified go tool<br>version     print Go version<br>vet         report likely mistakes in packages</pre><pre>Use &quot;go help &lt;command&gt;&quot; for more information about a command.</pre><pre>Additional help topics:</pre><pre>buildmode   build modes<br>c           calling between Go and C<br>cache       build and test caching<br>environment environment variables<br>filetype    file types<br>go.mod      the go.mod file<br>gopath      GOPATH environment variable<br>gopath-get  legacy GOPATH go get<br>goproxy     module proxy protocol<br>importpath  import path syntax<br>modules     modules, module versions, and more<br>module-get  module-aware go get<br>packages    package lists and patterns<br>testflag    testing flags<br>testfunc    testing functions</pre><pre>Use &quot;go help &lt;topic&gt;&quot; for more information about that topic.</pre><p>6.Tudo certo? Então estamos com tudo funcionando perfeitamente.</p><h3>Linux</h3><ol><li>Para iniciar o processo de instalação no Linux você deve acessar o link: <a href="https://golang.org/dl/">Download GO — Linux</a></li><li>Clique no botão para download e aguarde o processo ser finalizado.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/296/0*DYWdeJ_VsLqh2CPj" /></figure><p>3. Feito o Download, abra seu terminal e acesse o local no qual o arquivo foi baixado. Execute o comando para que ele seja descompactado:</p><pre>tar -C /usr/local -xzf go1.11.2.linux-amd64.tar.gz</pre><p><strong>Obs:</strong> é possível que em alguns casos seja necessário a utilização do “sudo” para a execução como root user.</p><p>4. Após descompactar o arquivo, é necessário adicionar o caminho da pasta onde o GO foi instalado no PATH raíz de sua máquina. Para isso, vou utilizar o editor VIM.</p><p><strong><em>Atenção! Muito cuidado nessa hora!</em></strong></p><ul><li>Primeiro vamos abrir o arquivo de configuração do bash.</li></ul><pre>vim ~/.bashrc</pre><blockquote>Caso não utilize bash, a edição pode ser feito no arquivo de configuração zsh ~/.zshrc.</blockquote><ul><li>Com ele aberto, vá para o final do arquivo e adicione o seguinte código.</li></ul><pre>export PATH=$PATH:/usr/local/go/bin</pre><p>Ele irá garantir que comandos e binários GO sejam reconhecidos pelo sistema.</p><ul><li>Salve o arquivo.</li></ul><p>5. Por fim, é necessário adicionar o GOPATH para que toda instalação e leitura de arquivo possa ser feita. Nesse caso, vamos definir o próprio “/urs/local/go” como GOPATH.</p><ul><li>Abra novamente o arquivo de configuração do bash.</li></ul><pre>vim ~/.bashrc</pre><blockquote>Caso não utilize bash, a edição pode ser feito no arquivo de configuração zsh <em>~/.zshrc.</em></blockquote><ul><li>Adicione o seguinte código.</li></ul><pre>export GOPATH=/urs/local/go</pre><ul><li>Salve o arquivo.</li></ul><p>6. Para testar se o GO realmente foi instalado em sua máquina, abra seu terminal e digite:</p><pre>go</pre><blockquote>Para que o comando descrito acima funcione perfeitamente, é necessário abrir um novo terminal para que as novas configurações do bash sejam carregadas.</blockquote><ul><li>A saída deve ser algo parecido com:</li></ul><pre>Go is a tool for managing Go source code.</pre><pre>Usage:</pre><pre>go &lt;command&gt; [arguments]</pre><pre>The commands are:</pre><pre>bug         start a bug report<br>build       compile packages and dependencies<br>clean       remove object files and cached files<br>doc         show documentation for package or symbol<br>env         print Go environment information<br>fix         update packages to use new APIs<br>fmt         gofmt (reformat) package sources<br>generate    generate Go files by processing source<br>get         download and install packages and dependencies<br>install     compile and install packages and dependencies<br>list        list packages or modules<br>mod         module maintenance<br>run         compile and run Go program<br>test        test packages<br>tool        run specified go tool<br>version     print Go version<br>vet         report likely mistakes in packages</pre><pre>Use &quot;go help &lt;command&gt;&quot; for more information about a command.</pre><pre>Additional help topics:</pre><pre>buildmode   build modes<br>c           calling between Go and C<br>cache       build and test caching<br>environment environment variables<br>filetype    file types<br>go.mod      the go.mod file<br>gopath      GOPATH environment variable<br>gopath-get  legacy GOPATH go get<br>goproxy     module proxy protocol<br>importpath  import path syntax<br>modules     modules, module versions, and more<br>module-get  module-aware go get<br>packages    package lists and patterns<br>testflag    testing flags<br>testfunc    testing functions</pre><pre>Use &quot;go help &lt;topic&gt;&quot; for more information about that topic.</pre><p>7. Tudo certo? Então estamos com tudo funcionando perfeitamente.</p><h3>macOS</h3><ol><li>Vamos instalar a linguagem GO utilizando o gerenciador de pacotes do macOS, o Homebrew. Para isso, utilize:</li></ol><pre>brew install go --cross-compile-common</pre><p>2. Com a instalação concluída, precisamos definir algumas variáveis de ambiente nos arquivos de configuração bash ou zsh. Nesse caso vamos utilizar o editor VIM, porem, sinta-se a vontade para utilizar o editor de sua preferência.</p><pre>vim ~/.bashrc</pre><p>ou</p><pre>vim ~/.zshrc</pre><ul><li>Adicione os seguintes <em>exports</em>:</li></ul><pre>export PATH=$PATH:/usr/local/go/bin<br>export GOPATH=/urs/local/go</pre><blockquote>Os exports são responsáveis por fazer com que o macOS reconheça e possa executar os binários GO.</blockquote><ul><li>Salve o arquivo.</li></ul><p>3. Para testar se o GO realmente foi instalado em sua máquina, abra seu terminal e digite:</p><pre>go</pre><blockquote>Para que o comando descrito acima funcione perfeitamente, é necessário abrir um novo terminal para que as novas configurações do bash sejam carregadas.</blockquote><ul><li>A saída deve ser algo parecido com:</li></ul><pre>Go is a tool for managing Go source code.</pre><pre>Usage:</pre><pre>go &lt;command&gt; [arguments]</pre><pre>The commands are:</pre><pre>bug         start a bug report<br>build       compile packages and dependencies<br>clean       remove object files and cached files<br>doc         show documentation for package or symbol<br>env         print Go environment information<br>fix         update packages to use new APIs<br>fmt         gofmt (reformat) package sources<br>generate    generate Go files by processing source<br>get         download and install packages and dependencies<br>install     compile and install packages and dependencies<br>list        list packages or modules<br>mod         module maintenance<br>run         compile and run Go program<br>test        test packages<br>tool        run specified go tool<br>version     print Go version<br>vet         report likely mistakes in packages</pre><pre>Use &quot;go help &lt;command&gt;&quot; for more information about a command.</pre><pre>Additional help topics:</pre><pre>buildmode   build modes<br>c           calling between Go and C<br>cache       build and test caching<br>environment environment variables<br>filetype    file types<br>go.mod      the go.mod file<br>gopath      GOPATH environment variable<br>gopath-get  legacy GOPATH go get<br>goproxy     module proxy protocol<br>importpath  import path syntax<br>modules     modules, module versions, and more<br>module-get  module-aware go get<br>packages    package lists and patterns<br>testflag    testing flags<br>testfunc    testing functions</pre><pre>Use &quot;go help &lt;topic&gt;&quot; for more information about that topic.</pre><p>4. Tudo certo? Então estamos com tudo funcionando perfeitamente.</p><h3>Conclusão</h3><p>Enfim, tudo funcionando!</p><p>Agora podemos iniciar nossos tutoriais com o que realmente importa: <strong>CÓDIGO!</strong>.</p><p>Nos vemos no próximo post!</p><p><a href="https://medium.com/gommunity/2-goschool-estrutura-b%C3%A1sica-9ce3e6b5fa27">#2 GoSchool : Estrutura Básica</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dcf0a7940c6d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gommunity/1-goschool-instala%C3%A7%C3%A3o-dcf0a7940c6d">#1 GoSchool : Instalação</a> was originally published in <a href="https://medium.com/gommunity">Gommunity</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>