<?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>Forem: Marcelo Pinheiro</title>
    <description>The latest articles on Forem by Marcelo Pinheiro (@celomamp).</description>
    <link>https://forem.com/celomamp</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%2F559935%2Fa0dfa299-ab5e-4f1b-aaea-210632bbc43a.jpg</url>
      <title>Forem: Marcelo Pinheiro</title>
      <link>https://forem.com/celomamp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/celomamp"/>
    <language>en</language>
    <item>
      <title>Começando com Go - parte 2 - Estruturando a API</title>
      <dc:creator>Marcelo Pinheiro</dc:creator>
      <pubDate>Wed, 17 Mar 2021 09:29:45 +0000</pubDate>
      <link>https://forem.com/celomamp/comecando-com-go-parte-2-estruturando-a-api-2gof</link>
      <guid>https://forem.com/celomamp/comecando-com-go-parte-2-estruturando-a-api-2gof</guid>
      <description>&lt;p&gt;Fala meus consagrados e consagradas, beleza?&lt;/p&gt;

&lt;p&gt;Bom, como eu havia dito ontem, hoje vamos criar nosso primeiro endpoint dentro da estrutura de clean architecture que estamos utilizando. Bora lá?&lt;/p&gt;

&lt;h2&gt;
  
  
  Rápida explicação sobre camadas de apresentação
&lt;/h2&gt;

&lt;p&gt;Dentro da pasta &lt;code&gt;api&lt;/code&gt; que havia sido criada, vamos criar uma outra pasta que vai guardar a implementação das nossas rotas. Seria o que chamamos da camada de apresentação. &lt;/p&gt;

&lt;p&gt;No clean architecture, podemos ter várias camadas de apresentação diferentes (por exemplo, API, Mensageria e Linha de comando), e o &lt;em&gt;tchan&lt;/em&gt; é que, neste caso, todas elas, caso tenham o mesmo propósito, implementam o mesmo &lt;strong&gt;caso de uso&lt;/strong&gt; que é onde realmente mora nossa lógica de negócio. &lt;/p&gt;

&lt;p&gt;Isso aumenta o aproveitamento de código, facilita o teste e ajuda o projeto a crescer de forma orgânica, sem bagunçar. Fique tranquilo se isso soa grego ainda, muito em breve nós vamos ver exemplos práticos do que eu to falando. Por enquanto, vamos nos ater aos detalhes de implementação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando a estrutura
&lt;/h2&gt;

&lt;p&gt;Como já explicado, dentro da pasta &lt;code&gt;api&lt;/code&gt;, crie um outro diretório chamado &lt;code&gt;handler&lt;/code&gt;, que é o diretório que vai guardar os nossos arquivos de rotas de api e &lt;strong&gt;lidar&lt;/strong&gt; com a implementação delas (por isso o nome &lt;code&gt;handler&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;management_api/api
&lt;span class="nb"&gt;mkdir &lt;/span&gt;handler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora nós vamos dividir o que a nossa api tem que servir por domínio. E um domínio óbvio é o de empresas. Estamos escrevendo um Saas (software as a service, ou software como serviço, se você quiser saber mais, o link é este: &lt;a href="https://neilpatel.com/br/blog/saas/"&gt;https://neilpatel.com/br/blog/saas/&lt;/a&gt;) para ajudar empresas a se comunicarem melhor e mais efetivamente com seus clientes. Logo, uma empresa precisa conseguir se cadastrar no nosso sistema para, depois, poder cadastrar seus clientes, envios, e todo o resto em que vamos chegar. Dito isto, vamos criar o arquivo que vai lidar com todos os endpoints relacionados a empresa.&lt;/p&gt;

&lt;p&gt;Dentro da pasta &lt;code&gt;handler&lt;/code&gt;, crie um arquivo chamado &lt;code&gt;company.go&lt;/code&gt;. E vamos começar a implementar nossa primeira rota. Vou fazer no mesmo modelo da parte 1, onde eu coloco o código comentado e explico o que cada linha faz.&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;//Especificamos que estas funções pertencem ao pacote handler.&lt;/span&gt;
&lt;span class="c"&gt;//É dessa forma que vamos importar o que precisamos depois&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;handler&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;"io"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/codegangsta/negroni"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gorilla/mux"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// Especificamos a função "createCompany()" e o tipo de retorno dela é http.Handler (vou explicar mais abaixo)&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;createCompany&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;//Crio um handler http que responde uma string com o valor "teste"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandlerFunc&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;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Teste"&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="c"&gt;//Crio uma função para especificar minhas rotas e passar a requisição para os handlers corretos&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;MakeCompanyHandlers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;negroni&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Negroni&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/v1/company"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;With&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;negroni&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;createCompany&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"OPTIONS"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"createCompany"&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;
  
  
  Alguns pontos importantes sobre o código acima:
&lt;/h2&gt;

&lt;h4&gt;
  
  
  http.Handler
&lt;/h4&gt;

&lt;p&gt;Na função &lt;code&gt;createCompany&lt;/code&gt;, nós retornamos um &lt;code&gt;http.Handler&lt;/code&gt;. O tipo &lt;code&gt;http.Handler&lt;/code&gt; é responsável por captar uma requisição (&lt;code&gt;http.Request&lt;/code&gt;) e um "escritor" de resposta (&lt;code&gt;http.ResponseWriter&lt;/code&gt;), dessa forma ele consegue ler os dados que vieram da requisição, como por exemplo, o &lt;code&gt;body&lt;/code&gt;, e também responder a essa requisição, enviando também o body ou status code. Esse tipo (o &lt;code&gt;http.Handler&lt;/code&gt;) é retornado da função &lt;code&gt;http.HandlerFunc&lt;/code&gt;, que recebe como parâmetro outra função com a implementação do handler (neste caso, passamos uma função anônima, ou seja, não demos nome para ela e a implementação dela ja está especificada) e passa para esta função estes dois objetos que especifiquei mais acima. Uma forma mais fácil de entender o conceito é se não utilizarmos uma função anônima, como abaixo:&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;//Essa é a função handler que contém a implementação&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;createCompanyHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Teste"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;//Essa é a função que transforma o handler acima em um http.Handler&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;createCompany&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;//Era na linha abaixo, no lugar de createCompanyHandler, que estávamos passando a função anônima&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandlerFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;createCompanyHandler&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;p&gt;Eu não vou seguir assim porque separar a implementação e a transformação em http.Handler faria nosso código ficar confuso e cheio de referências desnecessárias. Mas a ideia foi explicar este ponto de forma mais clara.&lt;/p&gt;

&lt;h4&gt;
  
  
  MakeCompanyHandlers
&lt;/h4&gt;

&lt;p&gt;Bom, a função &lt;code&gt;createCompany&lt;/code&gt; cria uma implementação que pode ser atrelada a uma rota, mas ainda não foi atrelada a nenhuma. Por enquanto, ela é só uma função sem aplicação. E é aí que surge a &lt;code&gt;MakeCompanyHandlers&lt;/code&gt;. Essa função recebe um objeto &lt;code&gt;mux.Router&lt;/code&gt;(lembra, lá no arquivo &lt;code&gt;main.go&lt;/code&gt;, que criamos um router mux? Esse cara que ela recebe) e um personagem novo, o &lt;code&gt;negroni.Negroni&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;mux.Router&lt;/code&gt; é um roteador simples, onde eu especifico as rotas e passo um handler para tratá-las. Condiz bem com o que a gente ta precisando, né?&lt;/p&gt;

&lt;p&gt;Mas o que raios faz esse &lt;code&gt;negroni&lt;/code&gt;? Bom, para entender o que ele faz, precisamos entender o que é uma &lt;code&gt;middleware&lt;/code&gt; no contexto de api.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Middlewares&lt;/code&gt; são processos ou lógicas que precisam ser executados sempre que uma ou mais rotas são chamadas, mas que não fazem parte da implementação destas rotas. Por exemplo, um processo de autenticação das minhas rotas. Eu poderia, em todas as rotas que eu criar, validar se o usuário está logado, por exemplo. Mas eu teria que repetir o mesmo código em todas as minhas rotas, e repetir código nunca é bom por muitas razões, entre elas, se um dia eu mudasse a minha autenticação, teria que mudar em todas as rotas que criei. Isso, além de criar acoplamento no código (acoplamento é quando códigos que não deveriam depender um do outro, dependem), atrapalhando os testes, dificultando a manutenção, etc etc etc.&lt;/p&gt;

&lt;p&gt;É por isso que utilizamos middlewares. No caso acima, eu apenas criaria um middleware responsável por autenticar o usuário &lt;strong&gt;antes&lt;/strong&gt; de chamar a rota que eu preciso. Assim, se o usuário não estivesse logado, o middleware já pararia esse cara. E a minha rota ficaria só com o código que ela tem que ficar, sem se preocupar com autenticação. &lt;/p&gt;

&lt;p&gt;E esse é o papel do &lt;code&gt;negroni&lt;/code&gt;: prover uma estrutura simples para criarmos middlewares. No código, eu encapsulo a nossa função &lt;code&gt;createCompany&lt;/code&gt; com o negroni utilizando a função &lt;code&gt;negroni.Wrap&lt;/code&gt;, que converte um &lt;code&gt;http.Handler&lt;/code&gt; (lembra dele?) em um &lt;code&gt;negroni.Handler&lt;/code&gt;, e depois "registro" esse &lt;code&gt;negroni.Handler&lt;/code&gt; na instância do &lt;code&gt;negroni&lt;/code&gt; que recebi via parâmetro da função &lt;code&gt;MakeCompanyHandlers&lt;/code&gt; para que ela "registre" esse novo handler e possa chamá-lo quando implementarmos um middleware. &lt;/p&gt;

&lt;p&gt;O restante é bem simples, chamo a função &lt;code&gt;router.Handle&lt;/code&gt; com a rota que eu quero servir a implementação da nossa &lt;code&gt;createCompany&lt;/code&gt;(no caso, &lt;code&gt;v1/company&lt;/code&gt;), especifico quais métodos HTTP ela deve responder (POST e OPTIONS) e dou um nome para essa rota (createCompany).&lt;/p&gt;

&lt;p&gt;Ufa ... Bora terminar de implementar isso aí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrando nossa rota
&lt;/h2&gt;

&lt;p&gt;Voltando para o arquivo &lt;code&gt;management_api/api/main.go&lt;/code&gt;, a primeira coisa que vamos fazer é gerar uma instância da classe (posso chamar assim em go? Não sei. Mas vou chamar de classe mesmo assim. Depois a turma me corrige) do &lt;code&gt;negroni&lt;/code&gt; e depois, chamar a função &lt;code&gt;MakeCompanyHandlers&lt;/code&gt; passando como parâmetro o router que já tínhamos e a instância do negroni.&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;//instancia o mux e o negroni&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;mux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;negroni&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="c"&gt;//Chamo a função MakeCompanyHandlers que registra nossas rotas&lt;/span&gt;
&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MakeCompanyHandlers&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="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o arquivo &lt;code&gt;main.go&lt;/code&gt; inteiro fica assim&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;"io"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;
    &lt;span class="s"&gt;"strconv"&lt;/span&gt;
    &lt;span class="s"&gt;"time"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/gorilla/context"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gorilla/mux"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/marcelocpinheiro/communication-engine/management_api/config"&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="c"&gt;//instancia o mux e o negroni&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;mux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;negroni&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="c"&gt;//Chamo a função MakeCompanyHandlers que registra nossas rotas&lt;/span&gt;
    &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MakeCompanyHandlers&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="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Repassa as rotas para o roteador&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&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="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Cria um handler para a url "/ping", escreve "running" na tela e retorna o status 200&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;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/ping"&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;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Running"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c"&gt;// Cria um logger para a aplicação&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&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;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"logger: "&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;Lshortfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Instancia um novo servidor com configurações específicas de timeout, endereço, log e handler&lt;/span&gt;
    &lt;span class="n"&gt;srv&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;http&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;ReadTimeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&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="n"&gt;WriteTimeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&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="n"&gt;Addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;         &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_PORT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClearHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultServeMux&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;ErrorLog&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="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;//Printa no terminal a porta que a aplicação está ouvindo&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Listening on port %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="c"&gt;//inicia o servidor e, se houver erro, mata a aplicação e printa o erro&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;srv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&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="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;Fatal&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="n"&gt;Error&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;p&gt;E é isso. Bora rodar?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run management_api/api/main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando ver que tá rodando, bora criar uma requisição POST. Eu utilizo o Curl, mas você pode usar o Insomnia, o próprio Postman, fica a seu critério.&lt;/p&gt;

&lt;p&gt;Anyway, o comando que você tem que rodar é&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="s1"&gt;'http://localhost:8080/v1/company'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo deu certo, agora você está vendo a resposta &lt;code&gt;Teste&lt;/code&gt;, que é o que retornamos na nossa função &lt;code&gt;createCompany&lt;/code&gt; lá no arquivo &lt;code&gt;company.go&lt;/code&gt;, indicando que está tudo funcionando.&lt;/p&gt;

&lt;p&gt;Fique ligado para acompanhar a série, e siga @devmediano no instagram, devo estar postando mais sobre essa série por lá.&lt;/p&gt;

&lt;p&gt;No próximo post vamos criar a implementação do nosso primeiro endpoint, armazenar a empresa na base de dados, retornar um json e também criar um endpoint de listagem de empresas. Até lá!&lt;/p&gt;

</description>
      <category>go</category>
      <category>api</category>
      <category>backend</category>
    </item>
    <item>
      <title>Começando com Go - parte 1 - O início </title>
      <dc:creator>Marcelo Pinheiro</dc:creator>
      <pubDate>Tue, 16 Mar 2021 10:01:32 +0000</pubDate>
      <link>https://forem.com/celomamp/comecando-com-go-parte-1-1o73</link>
      <guid>https://forem.com/celomamp/comecando-com-go-parte-1-1o73</guid>
      <description>&lt;p&gt;Salve, meu povo, tudo certo? Espero que sim.&lt;/p&gt;

&lt;p&gt;Bom, eu resolvi começar a aprender Golang, a linguagem para backend criada pelo Google. Não vou entrar em detalhes do que é a linguagem ou do porquê de eu decidir começar a aprendê-la. Tem materiais por aí muito melhor escritos do que qualquer coisa que eu pudesse colocar aqui. A intenção desta série é ir acompanhando e documentando meu desenvolvimento e descobertas e quem sabe, servir para alguém que estiver nessa mesma jornada.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que vou construir?
&lt;/h2&gt;

&lt;p&gt;Uma plataforma SaaS multitenancy que se integra a varias formas de envio de mensagem (E-mail, SMS, Voz, qualquer jeito que exista de se comunicar com um cliente) e, de forma escalável centralize estes envios, através de um api. Também teremos um portal em que seja possível administrar os meus envios, clientes, aplicações que poderão utilizar a api da ferramenta, etc.&lt;/p&gt;

&lt;p&gt;Tenho algumas premissas para esta construção:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementação de uma base de dados (Postgres) com migrações&lt;/li&gt;
&lt;li&gt;Implementação de uma mensageria (Rabbitmq) para gerenciar as solicitações de envio vindos da API.&lt;/li&gt;
&lt;li&gt;Arquitetura escalável (microsserviços)&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;API Rest documentada com Swagger&lt;/li&gt;
&lt;li&gt;Clean Architecture&lt;/li&gt;
&lt;li&gt;Monorepo&lt;/li&gt;
&lt;li&gt;Coverage de testes unitários acima de 80%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O resto, vamos ajustando durante essa jornada. Bora lá?&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes: instale o go
&lt;/h2&gt;

&lt;p&gt;Não é o propósito desta postagem explicar a instalação, tampouco como iniciar um projeto (dependencias, etc). A documentação é bem completa, da uma passada lá :D (btw, o link é: &lt;a href="https://golang.org/"&gt;https://golang.org/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;No entanto, uma coisa que está me ajudando muito é utilizar as extensões de golang do vscode. Poupei bastante tempo com a questão das dependências do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Começando: estruturação
&lt;/h2&gt;

&lt;p&gt;Sempre tive uma ótima experiência com clean architecture quando o assunto é organização do projeto. O software cresce de forma orgânica, fácil de ler e documentada. Como não vou inventar a roda, vou basear toda a minha estrutura do projeto no repositório &lt;a href="https://github.com/eminetto/clean-architecture-go-v2"&gt;https://github.com/eminetto/clean-architecture-go-v2&lt;/a&gt; (Obrigado, eminetto). Achei a estrutura simples yet completa, me parece ser um bom início.&lt;/p&gt;

&lt;h2&gt;
  
  
  Então, começando:
&lt;/h2&gt;

&lt;p&gt;A primeira coisa que fiz foi criar um diretório chamado &lt;code&gt;communication-engine&lt;/code&gt;, que vai ser a raiz do meu projeto e dentro dele, um diretório &lt;code&gt;management_api&lt;/code&gt;, que vai ser o diretório que vai guardar a minha api responsável por servir, futuramente, a aplicação front-end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; communication-engine/management_api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro da pasta &lt;code&gt;management_api&lt;/code&gt;, eu criei dos diretórios, o &lt;code&gt;api&lt;/code&gt;, que vai guardar todos os meus arquivos relacionados a api (handlers, middlewares, modelos de apresentação, etc) e também a pasta &lt;code&gt;config&lt;/code&gt;, cujo propósito é autodescritivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;communication-engine/management_api
&lt;span class="nb"&gt;mkdir &lt;/span&gt;api
&lt;span class="nb"&gt;mkdir &lt;/span&gt;config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na pasta &lt;code&gt;config&lt;/code&gt;, eu criei o arquivo &lt;code&gt;config_dev.go&lt;/code&gt;, com o seguinte conteúdo&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;config&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;DB_USER&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"communication_engine"&lt;/span&gt;
    &lt;span class="n"&gt;DB_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"communication_engine"&lt;/span&gt;
    &lt;span class="n"&gt;DB_DATABASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"communication_engine"&lt;/span&gt;
    &lt;span class="n"&gt;DB_HOST&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"127.0.0.1"&lt;/span&gt;
    &lt;span class="n"&gt;API_PORT&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já na pasta &lt;code&gt;api&lt;/code&gt;, o primeiro arquivo que criei foi o &lt;code&gt;main.go&lt;/code&gt;, que vai ser o arquivo de entrada da nossa api. A implementação dele, por enquanto, é bem simples:&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;"io"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;
    &lt;span class="s"&gt;"strconv"&lt;/span&gt;
    &lt;span class="s"&gt;"time"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/gorilla/context"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gorilla/mux"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/marcelocpinheiro/communication-engine/management_api/config"&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="c"&gt;//Instância um novo roteador MUX, um roteador http para go&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;mux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Repassa as rotas para o roteador&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&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="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Cria um handler para a url "/ping", escreve "running" na tela e retorna o status 200&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;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/ping"&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;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Running"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c"&gt;// Cria um logger para a aplicação&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&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;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"logger: "&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;Lshortfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Instancia um novo servidor com configurações específicas de timeout, endereço, log e handler&lt;/span&gt;
    &lt;span class="n"&gt;srv&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;http&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;ReadTimeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&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="n"&gt;WriteTimeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&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="n"&gt;Addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;         &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_PORT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClearHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultServeMux&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;ErrorLog&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="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;//Printa na tela a porta que a aplicação está ouvindo&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Listening on port %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API_PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="c"&gt;//inicia o servidor e, se houver erro, mata a aplicação e printa o erro&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;srv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&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="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;Fatal&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="n"&gt;Error&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;p&gt;&lt;strong&gt;Importante&lt;/strong&gt;: A importação da config se você estiver replicando esse projeto vai ser de acordo com o endereço de repositório que você especificou para o seu projeto, o que obviamente vai ser diferente do meu (espero). &lt;/p&gt;

&lt;p&gt;Vamos ver se isso está funcionando?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run management_api/api/main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo está certo, você deve estar vendo o seguinte output na sua tela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;2021/03/16 09:55:57 Listening on port 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E aí, o que resta é abrir o seu browser e bater na url &lt;code&gt;http://localhost:8080/ping&lt;/code&gt;. Você deve ver a palavra "Running" na tela. É isso, criamos o primeiro endpoint. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iV49nz5V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tcshyu8xrxqo5x417mio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iV49nz5V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tcshyu8xrxqo5x417mio.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fique ligado para acompanhar a série, e siga @devmediano no instagram, devo estar postando mais sobre essa série por lá.&lt;/p&gt;

&lt;p&gt;No próximo post vamos criar o primeiro endpoint dentro da estrutura do router, e já responder requisições post dentro da estrutura do clean architecture que está sendo utilizada. Até lá!&lt;/p&gt;

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