
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
 <channel>
   <title>languages on BLOG</title>
   <link>https://blog.renatoprado.com/tags/languages/</link>
   <description>Recent content in languages on BLOG</description>
   <generator>Hugo -- gohugo.io</generator>
   <language>en-us</language>
   <lastBuildDate>Sat, 27 Mar 2021 16:52:04 -0300</lastBuildDate>
   
       <atom:link href="https://blog.renatoprado.com/tags/languages/index.xml" rel="self" type="application/rss+xml" />
   
   
     <item>
       <title>Entendendo diferenças entre SDL Window, Surfaces e Rendering</title>
       <link>https://blog.renatoprado.com/posts/sdl-render-n-surfaces/</link>
       <pubDate>Fri, 16 Apr 2021 10:47:55 -0300</pubDate>
       
       <guid>https://blog.renatoprado.com/posts/sdl-render-n-surfaces/</guid>
       <description>&lt;p&gt;Nessa minha jornada em fazer um jogo rpg no estilo top-down, programando em SLD e usando GO,encontrei muitos tutoriais ensinando como usar o SDL, mas quase todos são muito voltados para exemplos de código,com pouca explicação do que são os componentes do SDL apresentados.&lt;/p&gt;&lt;p&gt;Eu gosto de entender aquilo que estou fazendo e por que estou usando tal elemento no lugar de outro elemento.&lt;/p&gt;&lt;p&gt;E dessa forma comecei a ficar confuso, afinal, o que é uma Surface, Window e Renderer? Como são relacionadas e como se diferem.&lt;/p&gt;&lt;p&gt;E encontrei &lt;a href=&#34;https://stackoverflow.com/questions/21007329/what-is-an-sdl-renderer&#34;&gt;esse post no stackoverflow&lt;/a&gt; que mostra que não é só eu que estava confuso, era uma dúvida bem comum.&lt;/p&gt;&lt;p&gt;E como forma de estudo vou descrever minha compreensão sobre o assunto.&lt;/p&gt;&lt;h2 id=&#34;sdl-window-surface-e-renderer&#34;&gt;SDL Window, Surface e Renderer&lt;/h2&gt;&lt;p&gt;O que são, para que servem e o que os diferem.&lt;/p&gt;&lt;h2 id=&#34;software-blitting&#34;&gt;Software Blitting&lt;/h2&gt;&lt;p&gt;Como iremos falar de 3 coisas que envolvem computação gráfica, acho importante primeiramente comoas imagens são processadas na tela.&lt;/p&gt;&lt;h2 id=&#34;bitmap&#34;&gt;Bitmap&lt;/h2&gt;&lt;p&gt;Primeiramente você precisa entender o que é um bitmap. bitmap é um arquivo de imagem não comprimido, ou seja, ele carrega todas as informações de pixel por pixel de uma imagemcomo é representado pelo computador, por coordenadas X, Y.&lt;/p&gt;&lt;h2 id=&#34;blit&#34;&gt;BLIT&lt;/h2&gt;&lt;p&gt;O termo blit vem de bit block transfer ou &amp;ldquo;transferência de bloco bit&amp;rdquo;, e isso ocorre em bitmaps. A operação envolve ao menos dois bitmaps, uma fonte e destino.Você por imaginar um jogo 2D, como Legend of Zelda por exemplo, onde você irá precisar desenhar a grama, depois sobrepor com um outro bitmap como um arbusto e depois sobrepor com outro bitmap como o herói Link, isso tudo ocorre usando Blit.&lt;/p&gt;&lt;p&gt;No SDL temos o SDL_RenderCopy, que é usado extensivamente no desenvolvimento de games 2D, que é basicamente faz esse overlay descrito acima.&lt;/p&gt;&lt;h2 id=&#34;sdl-window&#34;&gt;SDL Window&lt;/h2&gt;&lt;p&gt;Representa a janela que onde será renderizado seu jogo ou qualquer outra coisa que você estiver fazendo com SDL. Tem atributos como largura, altura, se irá executar em Fullscreen, se é redimensionavel, se tem borda ou não e coisas do tipo.&lt;/p&gt;&lt;h2 id=&#34;sdl-surface&#34;&gt;SDL Surface&lt;/h2&gt;&lt;p&gt;É simplesmente um estrutura que armazena informações de pixels usadas em software blitting&lt;/p&gt;&lt;h2 id=&#34;sdl-texture&#34;&gt;SDL Texture&lt;/h2&gt;&lt;p&gt;É como o SDL Surface, até chamam ele de nova versão do SDL Surface, há inclusive métodos para converter o SDL Surface em SDL Texture.É uma estrutura que contém um eficiente, driver-especifico representação de informações de pixels.&lt;/p&gt;&lt;p&gt;Uma diferença significativa do SDL Surface, é que o Texture roda na GPU enquanto o Surface roda usando CPU.&lt;/p&gt;&lt;h2 id=&#34;sdl-renderer&#34;&gt;SDL Renderer&lt;/h2&gt;&lt;p&gt;Enquanto Blitting é um processo simples de copiar bits entre diferentes buffers, Renderizar envolve todo os processamentosgráficos necessários para chegar a imagem final desejada, isso pode envolver inúmeros blittings e processamentos de finalidadegráfica necessários.&lt;/p&gt;&lt;p&gt;O Renderer está atrelado a uma Window e só pode renderizar a ela.&lt;/p&gt;&lt;p&gt;Vamos ver alguns metodos que darão uma compreensão melhor do que pode ser feito.&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;SDL_SetRenderDrawColor(renderer, r, g, b, a);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Define a cor que é usada para limpar a tela.&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;SDL_RenderClear(renderer);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;limpa o renderer com a cor que você definiu acima.&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;SDL_RenderCopy(SDL_Renderer&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; renderer, SDL_Texture&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; texture, SDL_Rect&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; srcrect, SDL_Rect&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; dstrect)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;É um dos métodos mais usados, recebe o renderer, a textura, um retângulo que refine parte da textura para aplicar e um outro retângulo que vai definir se a textura precisa mudar de escala, ser esticada ou comprimida.&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;SDL_RenderPresent(renderer);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aplica as alterações para a janela.&lt;/p&gt;&lt;h2 id=&#34;encerrando&#34;&gt;encerrando&lt;/h2&gt;&lt;p&gt;Espero que esse post ajude a esclarecer pessoas que como eu tinham duvidas sobre as diferenças desses elementos do SDL.&lt;/p&gt;</description>
     </item>
   
     <item>
       <title>Go Maps</title>
       <link>https://blog.renatoprado.com/posts/go-maps/</link>
       <pubDate>Wed, 31 Mar 2021 22:32:55 -0300</pubDate>
       
       <guid>https://blog.renatoprado.com/posts/go-maps/</guid>
       <description>&lt;p&gt;Maps são coleções de chave/valor, permitindo você iterar da mesma forma que você faria com arrays ou slices, porém,por ser coleções não ordenadas, não há como prever a ordem que você receberá os dados. Mesmo se você adicionar os dados em uma certa ordem, não há garantia de tal ordem na hora de resgatar esses dados.&lt;/p&gt;&lt;p&gt;Maps são implementados usando tabela Hash. Não vou entrar em detalhes sobre como funciona uma tabela hash, mas é interessante você saberque para armazenar chave/valor acaba sendo muito mais performático usar uma tabela Hash que armazenar em array usando registros de memória ordenados. Isso porque quando você passar a chave pedindo o valor, será executado uma hash function que recebe a chave e retornará onde está armazenado o registro, isso acontece geralmente em milissegundos em razão O(1).&lt;/p&gt;&lt;h2 id=&#34;criando-maps&#34;&gt;Criando Maps&lt;/h2&gt;&lt;p&gt;Há duas formas de criar maps:&lt;/p&gt;&lt;h3 id=&#34;criando-um-map-de-chave-string-e-valor-int&#34;&gt;Criando um map de chave string e valor int&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dict&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; make(&lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;criando-um-map-de-chave-string-e-valor-string&#34;&gt;Criando um map de chave string e valor string&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dictStocks&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tesla&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TSLA&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gamestop&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GME&amp;#34;&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;adicionando-um-novo-elemento-ao-map&#34;&gt;Adicionando um novo elemento ao Map&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dictStocks&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;amazon&amp;#34;&lt;/span&gt;] = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;AMZN&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;nil-maps&#34;&gt;Nil maps&lt;/h2&gt;&lt;p&gt;Você pode declarar um nil map, mas ao tentar atribuir um novo elemento resultará em Runtime Error.&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;myDict&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;myDict&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;panic: assignment to entry in nil map&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;verificando-chaves&#34;&gt;Verificando chaves&lt;/h2&gt;&lt;p&gt;Verificar se uma chave existe faz parte de trabalhar com maps.&lt;/p&gt;&lt;p&gt;Quando solicitamos um valor de uma chave map temos duas opções, receber o valor e uma flag que indica se a chave existe:&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dict&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; make(&lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;)&lt;span style=&#34;color:#a6e22e&#34;&gt;valor&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;existe&lt;/span&gt; = &lt;span style=&#34;color:#a6e22e&#34;&gt;dict&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chave&amp;#34;&lt;/span&gt;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nesse exemplo, como declaramos um mapa de chave string e valor string, caso a chave não exista, a variável valor receberá uma string zerada, ou seja uma string vazia &amp;ldquo;&amp;quot;, e existe receberá false. Se o map fosse de valor tipo int, a variável valor receberia 0.&lt;/p&gt;&lt;h2 id=&#34;iterando-maps&#34;&gt;Iterando maps&lt;/h2&gt;&lt;p&gt;Iterar em maps é muito semelhante a iterar em slices ou arrays usando range, exceto que não iremos receber índice e valor e sim chave e valor.&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;stocks&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;taesa&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;taee11&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;unipar&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UNIP6&amp;#34;&lt;/span&gt;}&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;chave&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;valor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;stocks&lt;/span&gt;){    &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;deletando-um-item-do-map&#34;&gt;Deletando um item do map&lt;/h2&gt;&lt;p&gt;Para deletar uma chave é bem simples:&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;delete(&lt;span style=&#34;color:#a6e22e&#34;&gt;meuMapa&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chave&amp;#34;&lt;/span&gt;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;alterando-um-map-passado-como-argumento-em-uma-função&#34;&gt;Alterando um map passado como argumento em uma função&lt;/h2&gt;&lt;p&gt;Um map passado por um argumento em uma função não cria uma cópia, mantendo a referencia ao map original. Ao realizar uma alteração no map, todas as referencias serão atualizadas.&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;deleteMapItem&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;meuMap&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;indice&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;){delete(&lt;span style=&#34;color:#a6e22e&#34;&gt;meuMap&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;indice&lt;/span&gt;)}&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {&lt;span style=&#34;color:#a6e22e&#34;&gt;stocks&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;taesa&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;taee11&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;unipar&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UNIP6&amp;#34;&lt;/span&gt;}&lt;span style=&#34;color:#a6e22e&#34;&gt;deleteMapItem&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;stocks&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;taesa&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;chave&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;valor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;stocks&lt;/span&gt;){        &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s, %s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;chave&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;valor&lt;/span&gt;)}}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Resultado:&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;unipar, UNIP6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
     </item>
   
     <item>
       <title>Porque gosto tanto da linguagem GO</title>
       <link>https://blog.renatoprado.com/posts/coisas-que-gosto-go/</link>
       <pubDate>Sat, 27 Mar 2021 16:52:04 -0300</pubDate>
       
       <guid>https://blog.renatoprado.com/posts/coisas-que-gosto-go/</guid>
       <description>&lt;h2 id=&#34;rápida-performance&#34;&gt;Rápida performance&lt;/h2&gt;&lt;p&gt;Go é compilado, isso significa que o código é convertido em código de maquina,onde o processador pode consumir sem ter que interpretar um script.&lt;/p&gt;&lt;p&gt;Isso faz com que Go seja uma linguagem rápida, podemos colocar o Go entre C++ e Javaem termos de velocidade, batendo Java em quase todos os benchmarks.&lt;/p&gt;&lt;p&gt;&lt;img src=&#34;https://blog.renatoprado.com/img/golang-language-runtimes-1.png&#34; alt=&#34;go vs others runtimes&#34; title=&#34;runtime comparison&#34;&gt;&lt;/p&gt;&lt;h2 id=&#34;compilação-rápida--rápido-feedback-de-desenvolvimento&#34;&gt;Compilação rápida = rápido Feedback de desenvolvimento&lt;/h2&gt;&lt;p&gt;Falando do tempo de compilação do código, Go tem uma compilação extremamente rápida,e essa é uma grande vantagem em relação a Java e C++, você mal vai perceber queo código foi compilado de tão rápido.  Isso faz muita diferença no dia a dia que vocêquer testar seu código inúmeras vezes ao dia.&lt;/p&gt;&lt;p&gt;&lt;img src=&#34;https://blog.renatoprado.com/img/compiling.png&#34; alt=&#34;compiling fast&#34; title=&#34;compiling fast&#34;&gt;&lt;/p&gt;&lt;h2 id=&#34;baixa-complexidade&#34;&gt;Baixa complexidade&lt;/h2&gt;&lt;p&gt;Programadores migram fácilmente de outras linguagem para Go, é fácil de ler e produzir,os criadores do Go procuraram manter a simplicidade na linguagem.&lt;/p&gt;&lt;p&gt;&lt;img src=&#34;https://blog.renatoprado.com/img/productive-feel.svg&#34; alt=&#34;how productive you feel&#34; title=&#34;how productive you feel&#34;&gt;&lt;/p&gt;&lt;p&gt;veja um exemplo:&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; ( &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hello&lt;/span&gt;() { &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello world goroutine&amp;#34;&lt;/span&gt;)}&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() { &lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hello&lt;/span&gt;() &lt;span style=&#34;color:#a6e22e&#34;&gt;time&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sleep&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;time&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Second&lt;/span&gt;) &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main function&amp;#34;&lt;/span&gt;)}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;portabilidade&#34;&gt;Portabilidade&lt;/h2&gt;&lt;p&gt;Go tem poucas dependências e cria binários facilmente para práticamente qualquer sistema operacional.A grande vantagem de ser compilável é que as dependências são resolvidas durante a compilação e nãodurante a interpretação, ou seja, você não precisa ficar resolvendo dependências para cada máquina que for rodar a aplicação.Se você está escrevendo uma aplicação para usuários finais é muito conveniente, você faz o build e os usuários apenas precisam o executar.&lt;/p&gt;&lt;p&gt;Aqui vai um exemplo de como compilar um &lt;strong&gt;binário para windows usando linux&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;primeiro você define algumas variáveis de ambiente e depois chama o comando de build:&lt;/p&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;GOOS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;windows GOARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;386&lt;/span&gt; go build -o hello.exe hello.go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;fácil, não ?&lt;/p&gt;&lt;h2 id=&#34;feito-para-usar-concorrência&#34;&gt;Feito para usar concorrência&lt;/h2&gt;&lt;p&gt;Go é feito nativamente para usar concorrências de forma eficiente e abstraída, você cria goroutinese o Go se encarrega em alocar elas em threads e gerênciar possíveis conflitos de concorrências entreelas. Isso permite a desenvolvedores com pouca experiência aproveitar as arquiteturas atuais de váriosnúcleos de processamento.&lt;/p&gt;&lt;p&gt;Veja &lt;a href=&#34;https://gobyexample.com/goroutines&#34;&gt;esse simples exemplo&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&#34;pouco-verboso&#34;&gt;Pouco Verboso&lt;/h2&gt;&lt;p&gt;Apesar de ser sim verboso comparado a python, linguagens compiladas costumam ser verbosas,mas é Go muito menos verboso que C++, C# ou Java.&lt;/p&gt;&lt;h2 id=&#34;garbage-collector&#34;&gt;Garbage Collector&lt;/h2&gt;&lt;p&gt;Go tem um ótimo garbage Collector. Go consome pouquíssima memória&lt;/p&gt;&lt;h2 id=&#34;resumindo&#34;&gt;Resumindo&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Alta performance&lt;/li&gt;&lt;li&gt;Compilação rápida&lt;/li&gt;&lt;li&gt;Facilidade de gerenciamento de concorrências e memórias&lt;/li&gt;&lt;li&gt;Baixo consumo de memória&lt;/li&gt;&lt;li&gt;Sintaxe simples&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Acredito que tais qualidades trouxeram Go para para o ranking das linguagens mais amadas e desejadas como podemos ver nos Surveys do stackoverflow dos últimos. Para mim GO não é Hype, é uma linguagem moderna que veio para ficar.&lt;/p&gt;&lt;p&gt;&lt;img src=&#34;https://blog.renatoprado.com/img/love_languages.png&#34; alt=&#34;most loved languages&#34; title=&#34;most loved languages&#34;&gt;&lt;img src=&#34;https://blog.renatoprado.com/img/desired_language.png&#34; alt=&#34;desired language&#34; title=&#34;desired language&#34;&gt;&lt;/p&gt;&lt;h2 id=&#34;fontes&#34;&gt;Fontes:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://blog.golang.org/survey2020-results&#34;&gt;Go Developer Survey 2020 Results&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://www.bluematador.com/blog/golang-pros-cons-devops-part-3-speed-lack-generics&#34;&gt;Golang Pros &amp;amp; Cons for DevOps - pt 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://codeburst.io/why-golang-is-great-for-portable-apps-94cf1236f481&#34;&gt;Why go is great for portability&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://insights.stackoverflow.com/survey/2020&#34;&gt;Survey stackoverflow 2020&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
     </item>
   
 </channel>
</rss>
