{"componentChunkName":"component---src-templates-blog-post-js","path":"/go-design-patterns/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Padroes-de-projeto\" style=\"position:relative;\">Padrões de projeto<a href=\"#Padroes-de-projeto\" aria-label=\"Padroes de projeto permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>São padrões já consagrados com técnicas que nos ajudam no dia-a-dia para solucionar alguns problemas em comum ou fazem com que a nossa aplicação seja mais fácil de mudar no futuro.\nAqui vamos propor um exemplo onde eu tenho uma aplicação que recebe dados que representem uma pessoa, mas uma pessoa aqui pode ser tanto uma pessoa física quanto uma pessoa jurídica. Então temos que decidir qual é o tipo da pessoa que está sendo informada, executar algumas validações e depois salvar os dados em um banco de dados.</p>\n<h2 id=\"Builder\" style=\"position:relative;\">Builder<a href=\"#Builder\" aria-label=\"Builder permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Vamos entender primeiramente o que é esse padrão e como ele nos ajudar aqui.\nO padrão <strong>Builder</strong> é um padrão para criação de objetos onde são informados os passos necessários para a sua criação.\nVamos imaginar que recebemos os nossos dados no seguinte padrão:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"name\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Pessoa\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"document\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"1234567890\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"PF\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui temos uma representação mais ou menos do que seria uma entrada de dados e temos que montar o nosso objeto, conseguimos saber que é uma pessoa do tipo pessoa física pelo campo <code class=\"language-text\">type</code> então vamos começar criando nosso arquivo <code class=\"language-text\">personBuilder.go</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> builder\n\n<span class=\"token keyword\">type</span> PersonBuilder <span class=\"token keyword\">interface</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token function\">SetName</span><span class=\"token punctuation\">(</span>name <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token function\">SetDocument</span><span class=\"token punctuation\">(</span>document <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> Person\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">GetBuilder</span><span class=\"token punctuation\">(</span>tyeName <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> PersonBuilder <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">if</span> tyeName <span class=\"token operator\">==</span> <span class=\"token string\">\"PF\"</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token operator\">&amp;</span>NaturalPerson<span class=\"token punctuation\">{</span>\n\t\t\tType<span class=\"token punctuation\">:</span> <span class=\"token string\">\"PF\"</span><span class=\"token punctuation\">,</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">if</span> tyeName <span class=\"token operator\">==</span> <span class=\"token string\">\"PJ\"</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token operator\">&amp;</span>LegalPerson<span class=\"token punctuation\">{</span>\n\t\t\tType<span class=\"token punctuation\">:</span> <span class=\"token string\">\"PJ\"</span><span class=\"token punctuation\">,</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token boolean\">nil</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui definimos a nossa <em>interface</em> <strong>PersonBuilder</strong> com as funções para adicionar o nome, o documento e a função encarregada por realizar a construção. Temos também a função <em>GetBuilder</em> que recebe o <code class=\"language-text\">type</code> e decide qual é o tipo que deve ser criado, caso seja pessoa física retorna um <strong>NaturalPerson</strong> caso seja pessoa jurídica retorna um <strong>LegalPerson</strong> já com um atributo <em>Type</em>.</p>\n<p>O que significa esses tipos <strong>NaturalPerson</strong> e <strong>LegalPerson</strong> e por que eles são considerados de um tipo <strong>PersonBuilder</strong>? Vamos ver o arquivo <code class=\"language-text\">naturalPerson.go</code> para entender:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> builder\n\n<span class=\"token keyword\">type</span> NaturalPerson <span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n\tName     <span class=\"token builtin\">string</span>\n\tDocument <span class=\"token builtin\">string</span>\n\tType     <span class=\"token builtin\">string</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>person <span class=\"token operator\">*</span>NaturalPerson<span class=\"token punctuation\">)</span> <span class=\"token function\">SetName</span><span class=\"token punctuation\">(</span>name <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tperson<span class=\"token punctuation\">.</span>Name <span class=\"token operator\">=</span> name\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>person <span class=\"token operator\">*</span>NaturalPerson<span class=\"token punctuation\">)</span> <span class=\"token function\">SetDocument</span><span class=\"token punctuation\">(</span>document <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tperson<span class=\"token punctuation\">.</span>Document <span class=\"token operator\">=</span> document\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>person <span class=\"token operator\">*</span>NaturalPerson<span class=\"token punctuation\">)</span> <span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> Person <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> Person<span class=\"token punctuation\">{</span>\n\t\tName<span class=\"token punctuation\">:</span>     person<span class=\"token punctuation\">.</span>Name<span class=\"token punctuation\">,</span>\n\t\tDocument<span class=\"token punctuation\">:</span> person<span class=\"token punctuation\">.</span>Document<span class=\"token punctuation\">,</span>\n\t\tType<span class=\"token punctuation\">:</span>     person<span class=\"token punctuation\">.</span>Type<span class=\"token punctuation\">,</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Uma coisa interessante no <strong>GO</strong> é a forma como ele implementa interfaces que é diferente de outras linguagens que são mais orientadas a objetos pois não fica explícito que estamos implementando uma interface e sim ocorre o que se chama <em>Duck Typing</em> que nada mais é do que: se o seu pacote, arquivo ou classe implementar os métodos de uma <em>interface</em> ele passa a ser daquele tipo. Isso segue a idéia de que se um animal anda como um pato, nada como um pato e voa como um pato então esse animal é um pato. </p>\n<p>É o que vemos na <strong>NaturalPerson</strong> que implementa as funções que estão na interface <strong>PersonBuilder</strong> então concluímos que qualquer arquivo que implemente as funções de <strong>PersonBuilder</strong> é do mesmo tipo dele.</p>\n<p>Podemos ver que a função <em>Build</em> retorna um <strong>Person</strong> e nessa função são atribuídos <em>Name</em>, <em>Document</em> e <em>Type</em>. Vamos ver esse arquivo:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> builder\n\n<span class=\"token keyword\">type</span> Person <span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n\tName               <span class=\"token builtin\">string</span>\n\tDocument           <span class=\"token builtin\">string</span>\n\tType               <span class=\"token builtin\">string</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><strong>Person</strong> nada mais é do que uma <em>struct</em>, relativo ao que seria uma classe em outras linguagens, onde temos a representação do que é uma pessoa para a nossa aplicação.</p>\n<p>Temos as peças soltas e agora vamos ver como juntar isso para fazer o nosso <strong>Builder</strong> funcionar:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\">\t<span class=\"token comment\">//Build a PersonBuilder, set values and build a NaturalPerson</span>\n\tpersonBuilder <span class=\"token operator\">:=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">GetBuilder</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"PF\"</span><span class=\"token punctuation\">)</span>\n\n\tpersonBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">SetName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"John Doe\"</span><span class=\"token punctuation\">)</span>\n\tpersonBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">SetDocument</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"21368063004\"</span><span class=\"token punctuation\">)</span>\n\tnaturalPerson <span class=\"token operator\">:=</span> personBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Aqui basicamente estamos passando como se fosse uma receita de como construir esse objeto e no fim chamamos a nossa função <em>Build</em> que vai construir o nosso objeto e devolvê-lo.</p>\n<h2 id=\"Chain-of-Responsibility\" style=\"position:relative;\">Chain of Responsibility<a href=\"#Chain-of-Responsibility\" aria-label=\"Chain of Responsibility permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Então agora temos uma forma de construir os nossos objetos, mas vamos pensar que eu queira executar uma série de passos com esses objetos, sejam validações, transformações e etc. como podemos fazer isso?</p>\n<p>Com <strong>Chain of Responsibility</strong> nós conseguimos criar uma cadeia de responsabilidades onde cada passo consegue processar e decide se passa pro próximo ou não.\nAqui vamos supor que conseguimos criar o objeto e queremos persistir em um banco de dados mas antes disso vamos validar se os dados estão certos, por exemplo se o documento é um CPF ou CNPJ correto para aquele tipo de pessoa e etc.</p>\n<p>Vamos executar esse processo em passos, vamos validar se o nome está preenchido e depois vamos validar se o CPF/CNPJ está no formato correto.\nVamos criar a nossa <em>interface</em> <strong>Validation</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> chain\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n\t<span class=\"token string\">\"github.com/guilhermegarcia86/go-patterns/builder\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">//Validation interface has functions for Chain of Responsability Pattern</span>\n<span class=\"token keyword\">type</span> Validation <span class=\"token keyword\">interface</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>builder<span class=\"token punctuation\">.</span>Person<span class=\"token punctuation\">)</span>\n\t<span class=\"token function\">SetNext</span><span class=\"token punctuation\">(</span>Validation<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Criamos a nossa interface e ela tem duas funções, uma pra executar a nossa lógica, <em>Execute</em>, que recebe um objeto do tipo <strong>Person</strong> e executa a nossa lógica e outra que vai chamar a próxima validação, <em>SetNext</em>.</p>\n<p>Vamos então criar as nossas validações, primeiro com a <strong>ValidationType</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> chain\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n\t<span class=\"token string\">\"log\"</span>\n\n\t<span class=\"token string\">\"github.com/guilhermegarcia86/go-patterns/builder\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">//ValidationType struct</span>\n<span class=\"token keyword\">type</span> ValidationType <span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n\tNext Validation\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//Execute a function to implement the user type validation execution</span>\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>validationType <span class=\"token operator\">*</span>ValidationType<span class=\"token punctuation\">)</span> <span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>user builder<span class=\"token punctuation\">.</span>Person<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token keyword\">if</span> user<span class=\"token punctuation\">.</span>ValidationTypeDone <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Validation type already done \"</span> <span class=\"token operator\">+</span> user<span class=\"token punctuation\">.</span>Type<span class=\"token punctuation\">)</span>\n\t\tvalidationType<span class=\"token punctuation\">.</span>Next<span class=\"token punctuation\">.</span><span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">return</span>\n\t<span class=\"token punctuation\">}</span>\n\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Validation type user starting \"</span> <span class=\"token operator\">+</span> user<span class=\"token punctuation\">.</span>Type<span class=\"token punctuation\">)</span>\n\tuser<span class=\"token punctuation\">.</span>ValidationTypeDone <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Execute next validation\"</span><span class=\"token punctuation\">)</span>\n\tvalidationType<span class=\"token punctuation\">.</span>Next<span class=\"token punctuation\">.</span><span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//SetNext a function that set the next call</span>\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>validationType <span class=\"token operator\">*</span>ValidationType<span class=\"token punctuation\">)</span> <span class=\"token function\">SetNext</span><span class=\"token punctuation\">(</span>next Validation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tvalidationType<span class=\"token punctuation\">.</span>Next <span class=\"token operator\">=</span> next\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui é somente uma prova de conceito onde poderíamos refinar e fazer tratativas de erros e outras validações mais efetivas, mas o importante aqui é que o nosso <em>Execute</em> recebe um objeto do tipo <strong>Person</strong> e verifica se validação já ocorreu com o atributo <code class=\"language-text\">user.ValidationTypeDone</code> e se já aconteceu chama o próximo, caso não tenha ocorrido a validação vai ser executada e chamará o próximo na cadeia.</p>\n<p>Para poder ter esse controle de estado, se já executou a validação, precisamos atualizar a nossa <strong>Person</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">type</span> Person <span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n\tName               <span class=\"token builtin\">string</span>\n\tDocument           <span class=\"token builtin\">string</span>\n\tType               <span class=\"token builtin\">string</span>\n\tValidationNameDone <span class=\"token builtin\">bool</span>\n\tValidationTypeDone <span class=\"token builtin\">bool</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Pronto temos os campos que controlam esse estado e eles são do tipo <code class=\"language-text\">bool</code> (booleanos).\nUma coisa muito importante para esse padrão funcionar é que deve ser definido quem será o último elo dessa corrente e no nosso caso como estamos fazendo só duas validações isso ficará na <strong>ValidationName</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> chain\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n\t<span class=\"token string\">\"log\"</span>\n\n\t<span class=\"token string\">\"github.com/guilhermegarcia86/go-patterns/builder\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">//ValidationName struct</span>\n<span class=\"token keyword\">type</span> ValidationName <span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n\tNext Validation\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//Execute a function to implement the user name validation execution</span>\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>validationName <span class=\"token operator\">*</span>ValidationName<span class=\"token punctuation\">)</span> <span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>user builder<span class=\"token punctuation\">.</span>Person<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token keyword\">if</span> user<span class=\"token punctuation\">.</span>ValidationNameDone <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Validation name already done \"</span> <span class=\"token operator\">+</span> user<span class=\"token punctuation\">.</span>Name<span class=\"token punctuation\">)</span>\n\t\tvalidationName<span class=\"token punctuation\">.</span>Next<span class=\"token punctuation\">.</span><span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">return</span>\n\t<span class=\"token punctuation\">}</span>\n\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Validation name user starting \"</span> <span class=\"token operator\">+</span> user<span class=\"token punctuation\">.</span>Name<span class=\"token punctuation\">)</span>\n\tuser<span class=\"token punctuation\">.</span>ValidationNameDone <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Validation finished\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//SetNext a function that set the next call</span>\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>validationName <span class=\"token operator\">*</span>ValidationName<span class=\"token punctuation\">)</span> <span class=\"token function\">SetNext</span><span class=\"token punctuation\">(</span>next Validation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tvalidationName<span class=\"token punctuation\">.</span>Next <span class=\"token operator\">=</span> next\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora vamos ver como seria o funcionamento das validações:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\">\t<span class=\"token comment\">//Begin a Validation chain</span>\n\tvalidationName <span class=\"token operator\">:=</span> <span class=\"token operator\">&amp;</span>chain<span class=\"token punctuation\">.</span>ValidationName<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\tvalidationType <span class=\"token operator\">:=</span> <span class=\"token operator\">&amp;</span>chain<span class=\"token punctuation\">.</span>ValidationType<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n\tvalidationType<span class=\"token punctuation\">.</span><span class=\"token function\">SetNext</span><span class=\"token punctuation\">(</span>validationName<span class=\"token punctuation\">)</span>\n\n\tvalidationType<span class=\"token punctuation\">.</span><span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>naturalPerson<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"Proxy\" style=\"position:relative;\">Proxy<a href=\"#Proxy\" aria-label=\"Proxy permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Agora pensando que nós já temos o nosso objeto criado e que já validamos e tratamos ele, precisamos seguir o nosso fluxo proposto que seria salvar essa informação em algum lugar, porém essa tarefa pode se tornar muito custosa dependendo de como será implementada. </p>\n<p>Por exemplo se formos salvar em um banco de dados temos todo o custo que é se conectar com o banco de dados, abrir uma transação, commitar e depois fechar, pensando em casos assim existe o padrão Proxy.</p>\n<p>Mas antes de explorá-lo vamos entender alguns pontos, se abrir a conexão com um banco é tão difícil por que então eu não tento fazer um código mais performático pra abrir a conexão e fazer todo o resto? </p>\n<p>A resposta é que nem sempre nós temos acesso ao código que vai ser executado, pensando nessa ideia de acesso ao banco de dados, geralmente temos bibliotecas prontas onde nós só fazemos as chamadas às suas funções sem que o código de como isso é feito seja exposto pra quem chamou.\nPorém se tivéssemos alguém que vai chamar uma vez o código <em>“pesado”</em> e vai guardar isso para nós e depois só usa a parte mais fácil sem chamar a parte pesada de novo, mas quem está chamando acha que está chamando o código pesado? </p>\n<p>A ideia de proxy vem de alguém que seja representante de outra pessoa e é isso o que ele vai fazer aqui, vamos criar uma interface chamada <strong>Database</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> proxy\n\n<span class=\"token comment\">// Database interface to access</span>\n<span class=\"token keyword\">type</span> Database <span class=\"token keyword\">interface</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> port <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> user <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> pass <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">error</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui temos a definição de um acesso à um banco de dados onde são passado os dados de conexão, agora vamos criar o <strong>Proxy</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> proxy\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n\t<span class=\"token string\">\"log\"</span>\n\t<span class=\"token string\">\"time\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">//Proxy struct</span>\n<span class=\"token keyword\">type</span> Proxy <span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n\tapplication <span class=\"token operator\">*</span>Application\n\turl         <span class=\"token builtin\">string</span>\n\tport        <span class=\"token builtin\">string</span>\n\tuser        <span class=\"token builtin\">string</span>\n\tpass        <span class=\"token builtin\">string</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//OpenConnection a function that simulates a heavy call to create a database connection</span>\n<span class=\"token keyword\">func</span> <span class=\"token function\">OpenConnection</span><span class=\"token punctuation\">(</span>url <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> port <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> user <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> pass <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span>Proxy <span class=\"token punctuation\">{</span>\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"A heavy process to create my connection with database\"</span><span class=\"token punctuation\">)</span>\n\ttime<span class=\"token punctuation\">.</span><span class=\"token function\">Sleep</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span> <span class=\"token operator\">*</span> time<span class=\"token punctuation\">.</span>Second<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token operator\">&amp;</span>Proxy<span class=\"token punctuation\">{</span>\n\t\tapplication<span class=\"token punctuation\">:</span> <span class=\"token operator\">&amp;</span>Application<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\t\turl<span class=\"token punctuation\">:</span>         url<span class=\"token punctuation\">,</span>\n\t\tport<span class=\"token punctuation\">:</span>        port<span class=\"token punctuation\">,</span>\n\t\tuser<span class=\"token punctuation\">:</span>        user<span class=\"token punctuation\">,</span>\n\t\tpass<span class=\"token punctuation\">:</span>        pass<span class=\"token punctuation\">,</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//Access a function that receives params and verifies if has connection opened and do access</span>\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>p <span class=\"token operator\">*</span>Proxy<span class=\"token punctuation\">)</span> <span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> port <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> user <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> pass <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">error</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token keyword\">if</span> <span class=\"token operator\">*</span>p <span class=\"token operator\">==</span> <span class=\"token punctuation\">(</span>Proxy<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\tp <span class=\"token operator\">=</span> <span class=\"token function\">OpenConnection</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n\n\tmsg<span class=\"token punctuation\">,</span> err <span class=\"token operator\">:=</span> p<span class=\"token punctuation\">.</span>application<span class=\"token punctuation\">.</span><span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token keyword\">if</span> err <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Fatalln</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ERROR\"</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n\n\t<span class=\"token keyword\">return</span> msg<span class=\"token punctuation\">,</span> <span class=\"token boolean\">nil</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Aqui é onde iríamos esconder a parte difícil da operação, temos a implementação de <em>Access</em> a função que irá abrir a conexão com o banco e a <em>struct</em> que irá controlar se a conexão já foi criada. </p>\n<p>A fim de explicar esse conceito a função <em>OpenConnection</em> tem um <em>Sleep</em> que vai aguardar 2 segundos e depois vai chamar o que seria o nosso acesso através do trecho:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\">msg<span class=\"token punctuation\">,</span> err <span class=\"token operator\">:=</span> p<span class=\"token punctuation\">.</span>application<span class=\"token punctuation\">.</span><span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Então aqui podemos ver que quem usar o proxy tem a impressão de que está acessando a função real <em>Access</em> sendo que na verdade está passando pelo proxy.</p>\n<p>E por fim o nosso <strong>Application</strong> que é a representação do que seria a biblioteca do terceiro:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> proxy\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n\t<span class=\"token string\">\"fmt\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">//Application struct</span>\n<span class=\"token keyword\">type</span> Application <span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//Access a function that will do the access</span>\n<span class=\"token keyword\">func</span> <span class=\"token punctuation\">(</span>a <span class=\"token operator\">*</span>Application<span class=\"token punctuation\">)</span> <span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> port <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> user <span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> pass <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">string</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">error</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token keyword\">return</span> fmt<span class=\"token punctuation\">.</span><span class=\"token function\">Sprintf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Success to connect database in url: %s port: %s user: %s\"</span><span class=\"token punctuation\">,</span> url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">nil</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E aqui temos a utilização completa do proxy:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">const</span> <span class=\"token punctuation\">(</span>\n\t\turl  <span class=\"token operator\">=</span> <span class=\"token string\">\"urlDatabase\"</span>\n\t\tport <span class=\"token operator\">=</span> <span class=\"token string\">\"3306\"</span>\n\t\tuser <span class=\"token operator\">=</span> <span class=\"token string\">\"user\"</span>\n\t\tpass <span class=\"token operator\">=</span> <span class=\"token string\">\"pass\"</span>\n\t<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Open connection, heavy process</span>\n\tconn <span class=\"token operator\">:=</span> proxy<span class=\"token punctuation\">.</span><span class=\"token function\">OpenConnection</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Access database</span>\n\tmsgI<span class=\"token punctuation\">,</span> err <span class=\"token operator\">:=</span> conn<span class=\"token punctuation\">.</span><span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">if</span> err <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Fatalln</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ERROR \"</span><span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span>msgI<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Do not open connection again</span>\n\tmsgII<span class=\"token punctuation\">,</span> err <span class=\"token operator\">:=</span> conn<span class=\"token punctuation\">.</span><span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">if</span> err <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Fatal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ERROR \"</span><span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span>msgII<span class=\"token punctuation\">)</span></code></pre></div>\n<p>A parte interessante aqui é que executando esse código teremos duas chamadas para função <em>Access</em> porém só a primeira vai demorar 2 segundos pois na próxima chamada o proxy já guardou a conexão.</p>\n<h2 id=\"Codigo-completo\" style=\"position:relative;\">Código completo<a href=\"#Codigo-completo\" aria-label=\"Codigo completo permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Aqui temos a nossa <code class=\"language-text\">main.go</code> onde temos a entrada de dados, construímos os nossos objetos, fazemos as nossas validações e depois simulamos a abertura com o banco de dados e acessamos:</p>\n<div class=\"gatsby-highlight\" data-language=\"go\"><pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">package</span> main\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">(</span>\n\t<span class=\"token string\">\"log\"</span>\n\n\t<span class=\"token string\">\"github.com/guilhermegarcia86/go-patterns/builder\"</span>\n\t<span class=\"token string\">\"github.com/guilhermegarcia86/go-patterns/chain\"</span>\n\t<span class=\"token string\">\"github.com/guilhermegarcia86/go-patterns/proxy\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">func</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n\t<span class=\"token comment\">//Build a PersonBuilder, set values and build a NaturalPerson</span>\n\tpersonBuilder <span class=\"token operator\">:=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">GetBuilder</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"PF\"</span><span class=\"token punctuation\">)</span>\n\n\tpersonBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">SetName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"John Doe\"</span><span class=\"token punctuation\">)</span>\n\tpersonBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">SetDocument</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"21368063004\"</span><span class=\"token punctuation\">)</span>\n\tnaturalPerson <span class=\"token operator\">:=</span> personBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Build a PersonBuilder, set values and build a LegalPerson</span>\n\tpersonBuilder <span class=\"token operator\">=</span> builder<span class=\"token punctuation\">.</span><span class=\"token function\">GetBuilder</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"PJ\"</span><span class=\"token punctuation\">)</span>\n\tpersonBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">SetName</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Cool Company\"</span><span class=\"token punctuation\">)</span>\n\tpersonBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">SetDocument</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"47902850000149\"</span><span class=\"token punctuation\">)</span>\n\tlegalPerson <span class=\"token operator\">:=</span> personBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Begin a Validation chain</span>\n\tvalidationName <span class=\"token operator\">:=</span> <span class=\"token operator\">&amp;</span>chain<span class=\"token punctuation\">.</span>ValidationName<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\tvalidationType <span class=\"token operator\">:=</span> <span class=\"token operator\">&amp;</span>chain<span class=\"token punctuation\">.</span>ValidationType<span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n\tvalidationType<span class=\"token punctuation\">.</span><span class=\"token function\">SetNext</span><span class=\"token punctuation\">(</span>validationName<span class=\"token punctuation\">)</span>\n\n\tvalidationType<span class=\"token punctuation\">.</span><span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>naturalPerson<span class=\"token punctuation\">)</span>\n\n\tvalidationType<span class=\"token punctuation\">.</span><span class=\"token function\">Execute</span><span class=\"token punctuation\">(</span>legalPerson<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token keyword\">const</span> <span class=\"token punctuation\">(</span>\n\t\turl  <span class=\"token operator\">=</span> <span class=\"token string\">\"urlDatabase\"</span>\n\t\tport <span class=\"token operator\">=</span> <span class=\"token string\">\"3306\"</span>\n\t\tuser <span class=\"token operator\">=</span> <span class=\"token string\">\"user\"</span>\n\t\tpass <span class=\"token operator\">=</span> <span class=\"token string\">\"pass\"</span>\n\t<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Open connection, heavy process</span>\n\tconn <span class=\"token operator\">:=</span> proxy<span class=\"token punctuation\">.</span><span class=\"token function\">OpenConnection</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Access database</span>\n\tmsgI<span class=\"token punctuation\">,</span> err <span class=\"token operator\">:=</span> conn<span class=\"token punctuation\">.</span><span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">if</span> err <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Fatalln</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ERROR \"</span><span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span>msgI<span class=\"token punctuation\">)</span>\n\n\t<span class=\"token comment\">//Do not open connection again</span>\n\tmsgII<span class=\"token punctuation\">,</span> err <span class=\"token operator\">:=</span> conn<span class=\"token punctuation\">.</span><span class=\"token function\">Access</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> port<span class=\"token punctuation\">,</span> user<span class=\"token punctuation\">,</span> pass<span class=\"token punctuation\">)</span>\n\t<span class=\"token keyword\">if</span> err <span class=\"token operator\">!=</span> <span class=\"token boolean\">nil</span> <span class=\"token punctuation\">{</span>\n\t\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Fatal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ERROR \"</span><span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n\tlog<span class=\"token punctuation\">.</span><span class=\"token function\">Println</span><span class=\"token punctuation\">(</span>msgII<span class=\"token punctuation\">)</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E temos a saída no console assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Validation <span class=\"token builtin class-name\">type</span> user starting PF\nExecute next validation\nValidation name user starting John Doe\nValidation finished\nValidation <span class=\"token builtin class-name\">type</span> user starting PJ\nExecute next validation\nValidation name user starting Cool Company\nValidation finished\nA heavy process to create my connection with database\nSuccess to connect database <span class=\"token keyword\">in</span> url: urlDatabase port: <span class=\"token number\">3306</span> user: user\nSuccess to connect database <span class=\"token keyword\">in</span> url: urlDatabase port: <span class=\"token number\">3306</span> user: user</code></pre></div>\n<p>O código completo pode ser encontrado <a href=\"https://github.com/guilhermegarcia86/go-patterns\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">aqui</a> </p>","fields":{"slug":"/go-design-patterns/"},"frontmatter":{"date":"18 de setembro de 2020","description":"Utilizando padrões Builder, Proxy e Chain of Responsibility","title":"Padrões de projeto com GO","tags":["Desenvolvimento","Go","Design Patterns"],"author":"Guilherme Alves","image":{"id":"dff67e4a-12da-5cfd-8642-054621b74375","publicURL":"/static/d8fe2ea5a496774381d13cf0a3bbd058/go-design.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAACDUlEQVQoz5WT22sTURDG82eKoC9aJa2FPtQ+KErRQvVBq6AFQdQXfVFB+qRoRUOxpXebNNlkk2z37CWbZHebZjfZ7C2fczYtTaN98INhOMyc38ycS8r3fXD1+/3/sn+JMYbUMJArHtrAfXxsw2uubhhh22giY5gQGiYiDlSUUyCln6nsRfGZ6gnoOL6q6Jj9sIRvZRlzP9bwUxBx79cOxEoFqSgIkqQwHiTXegEeHTRws6TjtWahE0X4aLRwS6xhvlpHPYhQtWxMreXwbmMLi6+eYaEgY6GkwlBoZMfrQez0sHnUQZX83bKB58zEV7ONl6qFRdbEDMF32108pkLzUgN1x8V40cC1HepsdRMX9ghYNdDQNKQOux6YF2C95SJjO5gSNOjU5VvdxizBL+cUrBy6SfcbrQ5mynVUFAmTuyLSBL0u1DCW1zGXLUEScqcjc9lBiImCmnT4VG5iuqgn0Ns07hfqeJJin5ptGPUaxvckpAsabuRVXM1ruC8wlAv7g0vpnxw6Ket4eEKwF4qJph8iiGO80Ww8pFGXrXaSo7VdpAk0IehURMOVfRUPKK7J8t/PJqDLKbo9SF0/MX6+J2vm+ehRXkB77mzncSnLCKbg4paIJYkNznAUeETva9lykhG55x1zn7FdfCdvhfScohBi6Tc+sxreywZWDmQ4pgZVHQGe9wNGdV4W/yl/ADYSKHPbv5hzAAAAAElFTkSuQmCC","aspectRatio":1.7877094972067038,"src":"/static/d8fe2ea5a496774381d13cf0a3bbd058/376bf/go-design.png","srcSet":"/static/d8fe2ea5a496774381d13cf0a3bbd058/c67b7/go-design.png 320w,\n/static/d8fe2ea5a496774381d13cf0a3bbd058/d3930/go-design.png 640w,\n/static/d8fe2ea5a496774381d13cf0a3bbd058/376bf/go-design.png 872w","sizes":"(max-width: 872px) 100vw, 872px"}}}},"timeToRead":10}},"pageContext":{"slug":"/go-design-patterns/","previous":{"fields":{"slug":"/factory-strategy/"},"frontmatter":{"title":"Usando padrões de projeto em uma aplicação","date":"14 set, 2020"}},"next":{"fields":{"slug":"/como-me-organizo-para-estudar/"},"frontmatter":{"title":"Como me organizo para estudar?","date":"24 set, 2020"}}}},"staticQueryHashes":["63159454"]}