<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: João Filippe Rossi Rodrigues</title>
    <description>The latest articles on DEV Community by João Filippe Rossi Rodrigues (@joaofilippe).</description>
    <link>https://dev.to/joaofilippe</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1291306%2F4efed738-4272-4653-a368-e1e0530c2495.jpeg</url>
      <title>DEV Community: João Filippe Rossi Rodrigues</title>
      <link>https://dev.to/joaofilippe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joaofilippe"/>
    <language>en</language>
    <item>
      <title>A técnica dos dois ponteiros</title>
      <dc:creator>João Filippe Rossi Rodrigues</dc:creator>
      <pubDate>Wed, 15 Jan 2025 14:12:30 +0000</pubDate>
      <link>https://dev.to/joaofilippe/a-tecnica-dos-dois-ponteiros-38km</link>
      <guid>https://dev.to/joaofilippe/a-tecnica-dos-dois-ponteiros-38km</guid>
      <description>&lt;h1&gt;
  
  
  Maximização da Área do Contêiner com Dois Ponteiros em Go
&lt;/h1&gt;

&lt;p&gt;Ao resolver problemas que envolvem arrays ou listas, a técnica dos dois ponteiros é uma estratégia poderosa e eficiente. Neste artigo, vamos explorar como usar essa técnica para resolver o problema "Container With Most Water", que envolve encontrar a área máxima entre duas linhas verticais em um gráfico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enunciado do Problema
&lt;/h2&gt;

&lt;p&gt;Dado um array de inteiros não negativos onde cada inteiro representa a altura de uma linha vertical em um gráfico, encontre duas linhas que, junto com o eixo x, formem um contêiner que contenha a maior quantidade de água.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;

&lt;p&gt;Vamos considerar o array &lt;code&gt;height = [1, 8, 6, 2, 5, 4, 8, 3, 7]&lt;/code&gt;. O objetivo é encontrar as duas linhas que formam o contêiner com a área máxima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Técnica dos Dois Ponteiros
&lt;/h2&gt;

&lt;p&gt;A técnica dos dois ponteiros envolve inicializar dois ponteiros no início e no final do array e movê-los em direção um ao outro para encontrar a solução ideal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicação Passo a Passo
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inicialização&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; é inicializado como 0 para armazenar a maior área encontrada.&lt;/li&gt;
&lt;li&gt;Dois ponteiros, &lt;code&gt;l&lt;/code&gt; (esquerda) e &lt;code&gt;r&lt;/code&gt; (direita), são inicializados no início e no final do array, respectivamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enquanto &lt;code&gt;l&lt;/code&gt; for menor que &lt;code&gt;r&lt;/code&gt;, o loop continua.&lt;/li&gt;
&lt;li&gt;A área entre as linhas nos índices &lt;code&gt;l&lt;/code&gt; e &lt;code&gt;r&lt;/code&gt; é calculada como &lt;code&gt;min(height[l], height[r]) * (r - l)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; é atualizado se a área calculada for maior que o valor atual de &lt;code&gt;maxArea&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Movimento dos Ponteiros&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para potencialmente encontrar uma área maior, o ponteiro que aponta para a linha mais curta é movido:

&lt;ul&gt;
&lt;li&gt;Se &lt;code&gt;height[l]&lt;/code&gt; for menor que &lt;code&gt;height[r]&lt;/code&gt;, incremente &lt;code&gt;l&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Caso contrário, decremente &lt;code&gt;r&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retorno&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando os ponteiros se encontram, o loop termina, e &lt;code&gt;maxArea&lt;/code&gt; é retornado como a maior área encontrada.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Exemplo Passo a Passo
&lt;/h3&gt;

&lt;p&gt;Vamos percorrer o exemplo &lt;code&gt;height = [1, 8, 6, 2, 5, 4, 8, 3, 7]&lt;/code&gt; passo a passo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inicialização&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;maxArea = 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 0&lt;/code&gt; (altura 1) e &lt;code&gt;r = 8&lt;/code&gt; (altura 7)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Primeira Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Área: &lt;code&gt;min(1, 7) * (8 - 0) = 1 * 8 = 8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Atualiza &lt;code&gt;maxArea&lt;/code&gt;: &lt;code&gt;maxArea = max(0, 8) = 8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;l&lt;/code&gt; (já que &lt;code&gt;height[l] &amp;lt; height[r]&lt;/code&gt;): &lt;code&gt;l = 1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Segunda Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 1&lt;/code&gt; (altura 8) e &lt;code&gt;r = 8&lt;/code&gt; (altura 7)&lt;/li&gt;
&lt;li&gt;Área: &lt;code&gt;min(8, 7) * (8 - 1) = 7 * 7 = 49&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Atualiza &lt;code&gt;maxArea&lt;/code&gt;: &lt;code&gt;maxArea = max(8, 49) = 49&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;r&lt;/code&gt;: &lt;code&gt;r = 7&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Terceira Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 1&lt;/code&gt; (altura 8) e &lt;code&gt;r = 7&lt;/code&gt; (altura 3)&lt;/li&gt;
&lt;li&gt;Área: &lt;code&gt;min(8, 3) * (7 - 1) = 3 * 6 = 18&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; permanece 49&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;r&lt;/code&gt;: &lt;code&gt;r = 6&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quarta Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 1&lt;/code&gt; (altura 8) e &lt;code&gt;r = 6&lt;/code&gt; (altura 8)&lt;/li&gt;
&lt;li&gt;Área: &lt;code&gt;min(8, 8) * (6 - 1) = 8 * 5 = 40&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; permanece 49&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;r&lt;/code&gt;: &lt;code&gt;r = 5&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quinta Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 1&lt;/code&gt; (altura 8) e &lt;code&gt;r = 5&lt;/code&gt; (altura 4)&lt;/li&gt;
&lt;li&gt;Área: &lt;code&gt;min(8, 4) * (5 - 1) = 4 * 4 = 16&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; permanece 49&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;r&lt;/code&gt;: &lt;code&gt;r = 4&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sexta Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 1&lt;/code&gt; (altura 8) e &lt;code&gt;r = 4&lt;/code&gt; (altura 5)&lt;/li&gt;
&lt;li&gt;Área: &lt;code&gt;min(8, 5) * (4 - 1) = 5 * 3 = 15&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; permanece 49&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;r&lt;/code&gt;: &lt;code&gt;r = 3&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sétima Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 1&lt;/code&gt; (altura 8) e &lt;code&gt;r = 3&lt;/code&gt; (altura 2)&lt;/li&gt;
&lt;li&gt;Área: &lt;code&gt;min(8, 2) * (3 - 1) = 2 * 2 = 4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; permanece 49&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;r&lt;/code&gt;: &lt;code&gt;r = 2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oitava Iteração&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ponteiros: &lt;code&gt;l = 1&lt;/code&gt; (altura 8) e &lt;code&gt;r = 2&lt;/code&gt; (altura 6)&lt;/li&gt;
&lt;li&gt;Área: &lt;code&gt;min(8, 6) * (2 - 1) = 6 * 1 = 6&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxArea&lt;/code&gt; permanece 49&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;r&lt;/code&gt;: &lt;code&gt;r = 1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fim do Loop&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os ponteiros se encontram (&lt;code&gt;l = r&lt;/code&gt;), então o loop termina.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O valor final de &lt;code&gt;maxArea&lt;/code&gt; é 49, que é a maior área possível entre duas linhas no array &lt;code&gt;height&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solução em Go
&lt;/h2&gt;

&lt;p&gt;Aqui está o código completo em Go implementando a técnica dos dois ponteiros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;maxarea&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;maxArea&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;maxArea&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;maxArea&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxArea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maxArea&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A técnica dos dois ponteiros é uma ferramenta poderosa para resolver problemas que envolvem arrays ou listas. Movendo os ponteiros de forma inteligente, podemos encontrar a solução ideal de maneira eficiente. &lt;/p&gt;

&lt;p&gt;No problema "Container With Most Water", essa técnica nos permite encontrar a área máxima entre duas linhas em tempo linear&lt;/p&gt;

</description>
      <category>go</category>
      <category>twopointer</category>
      <category>leetcode</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Golang e DSA</title>
      <dc:creator>João Filippe Rossi Rodrigues</dc:creator>
      <pubDate>Tue, 14 Jan 2025 15:59:40 +0000</pubDate>
      <link>https://dev.to/joaofilippe/golang-e-dsa-29p2</link>
      <guid>https://dev.to/joaofilippe/golang-e-dsa-29p2</guid>
      <description>&lt;p&gt;No vasto cenário das linguagens de programação, escolher a certa para aprender Estruturas de Dados e Algoritmos (DSA) pode ter um grande impacto na sua curva de aprendizado e eficácia. Aqui está por que Golang, ou Go, se destaca como uma excelente escolha para essa jornada educacional:&lt;/p&gt;

&lt;h3&gt;
  
  
  1 - Simplicidade e Legibilidade
&lt;/h3&gt;

&lt;p&gt;Golang foi projetado com simplicidade em mente. Sua sintaxe é limpa e concisa, tornando mais fácil para iniciantes entenderem conceitos complexos sem se perderem em açúcar sintático ou código excessivamente verboso. Quando você está aprendendo DSA, a última coisa que você quer é que a linguagem seja uma barreira. A sintaxe direta do Go permite que você se concentre na lógica das estruturas de dados e algoritmos, e não na sintaxe da linguagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Exemplo de um nó de lista encadeada simples em Go&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;Next&lt;/span&gt;  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2 - Suporte a Concorrência
&lt;/h3&gt;

&lt;p&gt;Entender como as estruturas de dados e algoritmos funcionam sob concorrência é crucial na computação moderna. Go oferece suporte integrado para concorrência através de goroutines e canais, que são leves e fáceis de usar. Esse recurso permite explorar a programação concorrente junto com DSA, preparando você para aplicações do mundo real onde o desempenho em multi-threading é fundamental.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Exemplo de uso de goroutines para trabalhar com um slice&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// Faça algo com v&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Espera as goroutines terminarem&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3 - Coleta de Lixo
&lt;/h3&gt;

&lt;p&gt;A gestão de memória pode ser uma grande distração ao aprender DSA. O coletor de lixo do Golang cuida dos vazamentos de memória, permitindo que você se concentre nos algoritmos em si, em vez de se preocupar com a alocação e desalocação manual de memória. Isso é particularmente benéfico ao lidar com estruturas de dados complexas como árvores ou grafos.&lt;/p&gt;

&lt;h3&gt;
  
  
  4 - Tipagem Estática
&lt;/h3&gt;

&lt;p&gt;A tipagem estática do Go ajuda a capturar erros em tempo de compilação e não em tempo de execução. Isso significa que você pode depurar suas implementações de DSA de maneira mais eficiente, pois incompatibilidades de tipo ou outros erros lógicos serão identificados antes que o programa seja executado, proporcionando um ambiente de aprendizado mais estável.&lt;/p&gt;

&lt;h3&gt;
  
  
  5 - Compilação Rápida
&lt;/h3&gt;

&lt;p&gt;Go compila rapidamente, o que significa que você gasta menos tempo esperando seu código compilar e mais tempo iterando sobre seus conceitos de DSA. Esse ciclo de feedback rápido é inestimável quando você está experimentando diferentes abordagens para resolver problemas algorítmicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 - Facilidade de Testabilidade
&lt;/h3&gt;

&lt;p&gt;Um dos pontos fortes do Go para aprender DSA é a facilidade de testabilidade. Go possui suporte integrado para escrever testes ao lado do seu código. Com o pacote testing, você pode facilmente escrever, executar e gerenciar testes unitários para suas estruturas de dados e algoritmos. Isso incentiva boas práticas de codificação desde o início, permitindo que você verifique a correção das suas implementações rapidamente. Aqui está um exemplo breve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Exemplo de teste para uma função simples&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Add(2, 3) = %d; want 5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7 - Biblioteca Padrão
&lt;/h3&gt;

&lt;p&gt;A biblioteca padrão do Go é abrangente, mas minimalista, oferecendo ferramentas poderosas para implementar estruturas de dados e algoritmos sem a necessidade de bibliotecas externas. Desde algoritmos de ordenação até contêineres, a biblioteca padrão fornece tudo o que você precisa para começar a implementar e testar seu conhecimento em DSA.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Escolher Golang para aprender Estruturas de Dados e Algoritmos não só simplifica o processo de aprendizado, mas também equipa você com habilidades relevantes para o desenvolvimento de software moderno. &lt;/p&gt;

&lt;p&gt;Sua simplicidade, combinada com recursos poderosos de concorrência, bibliotecas padrão robustas e, especialmente, a facilidade de testabilidade, fazem do Go uma linguagem ideal para mergulhar profundamente no mundo dos algoritmos e estruturas de dados. &lt;/p&gt;

&lt;p&gt;Seja você um iniciante ou buscando solidificar seu conhecimento, Go pode ser seu aliado nesta jornada educacional.&lt;/p&gt;

</description>
      <category>go</category>
      <category>dsa</category>
      <category>datastructures</category>
    </item>
    <item>
      <title>Golang and DSA</title>
      <dc:creator>João Filippe Rossi Rodrigues</dc:creator>
      <pubDate>Tue, 14 Jan 2025 15:55:12 +0000</pubDate>
      <link>https://dev.to/joaofilippe/golang-and-dsa-21gb</link>
      <guid>https://dev.to/joaofilippe/golang-and-dsa-21gb</guid>
      <description>&lt;p&gt;In the vast landscape of programming languages, choosing the right one for learning Data Structures and Algorithms (DSA) can significantly impact your learning curve and effectiveness. Here's why Golang, or Go, stands out as an excellent choice for this educational journey:&lt;/p&gt;

&lt;h3&gt;
  
  
  1 - Simplicity and Readability
&lt;/h3&gt;

&lt;p&gt;Golang was designed with simplicity in mind. Its syntax is clean and concise, making it easier for beginners to understand complex concepts without getting bogged down by syntactic sugar or overly verbose code. When you're learning DSA, the last thing you want is for the language to be a barrier. Go's straightforward syntax allows you to focus on the logic of data structures and algorithms rather than the syntax of the language.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Example of a simple linked list node in Go&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;Next&lt;/span&gt;  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2 - Concurrency Support
&lt;/h3&gt;

&lt;p&gt;Understanding how data structures and algorithms perform under concurrency is crucial in modern computing. Go provides built-in support for concurrency through goroutines and channels, which are lightweight and easy to use. This feature allows you to explore concurrent programming alongside DSA, preparing you for real-world applications where performance under multi-threading is key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Example of using goroutines to work with a slice&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// Do something with v&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Wait for goroutines to finish&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3 - Garbage Collection
&lt;/h3&gt;

&lt;p&gt;Memory management can be a significant distraction when learning DSA. Golang's garbage collector takes care of memory leaks, allowing you to concentrate on the algorithms themselves rather than worrying about manual memory allocation and deallocation. This is particularly beneficial when dealing with complex data structures like trees or graphs.&lt;/p&gt;

&lt;h3&gt;
  
  
  4 - Static Typing
&lt;/h3&gt;

&lt;p&gt;Go's static typing helps catch errors at compile time rather than runtime. This means you can debug your DSA implementations more efficiently, as type mismatches or other logical errors will be identified before the program runs, providing a more stable learning environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  5 - Fast Compilation
&lt;/h3&gt;

&lt;p&gt;Go compiles quickly, which means you spend less time waiting for your code to compile and more time iterating over your DSA concepts. This rapid feedback loop is invaluable when you're experimenting with different approaches to solve algorithmic problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 - Standard Library
&lt;/h3&gt;

&lt;p&gt;Go's standard library is comprehensive but minimalistic, offering powerful tools for implementing data structures and algorithms without the need for external libraries. From sorting algorithms to containers, the standard library provides everything you need to start implementing and testing your DSA knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  7 - Ease of Testability
&lt;/h3&gt;

&lt;p&gt;One of the standout features of Go for learning DSA is its ease of testability. Go has built-in support for writing tests alongside your code. With the testing package, you can easily write, run, and manage unit tests for your data structures and algorithms. This encourages good coding practices from the start, allowing you to verify the correctness of your implementations quickly. Here's a brief example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Example test for a simple function&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Add(2, 3) = %d; want 5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Choosing Golang for learning Data Structures and Algorithms not only simplifies the learning process but also equips you with skills relevant to modern software development. Its simplicity, coupled with powerful concurrency features and robust standard libraries, makes it an ideal language to delve deep into the world of algorithms and data structures. Whether you're just starting or looking to solidify your knowledge, Go can be your companion in this educational journey.&lt;/p&gt;

&lt;p&gt;Feel free to customize this text further for your Medium post, adding personal insights or additional examples that resonate with your experience.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Encapulating the Server</title>
      <dc:creator>João Filippe Rossi Rodrigues</dc:creator>
      <pubDate>Mon, 13 Jan 2025 21:59:52 +0000</pubDate>
      <link>https://dev.to/joaofilippe/encapulating-the-server-56p1</link>
      <guid>https://dev.to/joaofilippe/encapulating-the-server-56p1</guid>
      <description>&lt;p&gt;In my personal project, I recently decided to encapsulate the Echo server in a struct to improve the organization, maintainability, and extensibility of my code. In this article, I’ll explain the benefits of this approach and provide a practical example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Encapsulate the Echo Server?
&lt;/h2&gt;

&lt;p&gt;Encapsulating the Echo server in a struct offers several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organization and Modularity: Grouping all server-related operations in a single struct makes the code easier to read and maintain.
Ease of Configuration: Centralizing server configuration allows for easy application of global settings, such as middlewares and ports.&lt;/li&gt;
&lt;li&gt;Extensibility: Adding new functionalities becomes straightforward. You can add methods for configuring middlewares, routes, and other server-specific features without modifying the main code.
Testability: Creating unit and integration tests becomes easier. You can instantiate the server with different configurations and test its functionalities in isolation.&lt;/li&gt;
&lt;li&gt;Dependency Injection: Encapsulating the server allows for organized dependency injection, making it easier to pass configurations, services, and other components needed for the server’s operation.&lt;/li&gt;
&lt;li&gt;Framework Agnosticism: By encapsulating the server logic, you can easily switch to another framework if you find a better one, without incurring high maintenance costs. This abstraction layer decouples your application logic from the specific server implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Example
&lt;/h2&gt;

&lt;p&gt;Here is an example of how I encapsulated the Echo server in my project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/labstack/echo/v4"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/labstack/echo/v4/middleware"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Echo&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recover&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buildRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;buildRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="c"&gt;// Add other routes here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using the Server in main
&lt;/h2&gt;

&lt;p&gt;To use the encapsulated server in your main function, you can simply create a new instance of the server and call its Start method.&lt;/p&gt;

&lt;p&gt;Notice that the main function has no idea which framework is being used to run the server. This highlights the framework agnosticism of the approach.&lt;/p&gt;

&lt;p&gt;The server configuration, including middleware setup and route definitions, is centralized within the Server struct, making it easy to manage and modify.&lt;/p&gt;

&lt;p&gt;By encapsulating the server logic in a struct, the main function remains clean and focused on high-level application flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"discount-club/infra/api"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8000"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Failed to start server: %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example Tests
&lt;/h2&gt;

&lt;p&gt;Creating unit and integration tests for the encapsulated server is straightforward and highlights the benefits of encapsulation. Encapsulating the server logic makes it easier to create isolated tests for different components and functionalities. Grouping related tests in a suite improves the organization and readability of the test code. Here are two example test cases for the encapsulated server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;api_test&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http/httptest"&lt;/span&gt;
    &lt;span class="s"&gt;"testing"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/joaofilippe/discount-club/infra/api"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/stretchr/testify/assert"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/stretchr/testify/suite"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;ServerTestSuite&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;suite&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Suite&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ServerTestSuite&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;SetupTest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ServerTestSuite&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;TestNewServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotNil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotNil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ServerTestSuite&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;TestSingletonServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;server1&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;server2&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;server1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestServerTestSuite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;suite&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerTestSuite&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Encapsulating the Echo server in a struct brings several benefits in terms of organization, maintainability, extensibility, testability, and dependency injection. This approach helps create cleaner, more modular, and easier-to-maintain code. I applied this technique in my personal project, and it has significantly improved the structure and readability of my code.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
