{"id":71628,"date":"2020-02-27T08:51:24","date_gmt":"2020-02-27T05:51:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/aleksej-grachyov-go-frontend"},"modified":"2020-03-03T16:14:16","modified_gmt":"2020-03-03T13:14:16","slug":"aleksej-grachyov-go-frontend","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","title":{"rendered":"Aleksei Grachev: Go Frontend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kyiv Go Meetup Maio 2018:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9974ab1db5347a41e4ec5110c3d2ef56.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Apresentador:<\/b> \u2013 Ol\u00e1 a todos! Obrigado por estarem aqui! Hoje temos dois palestrantes oficiais \u2013 Lyosha e Vanya. Haver\u00e1 mais dois, se tivermos tempo. O primeiro palestrante \u00e9 Aleksey Grachev, que nos falar\u00e1 sobre GopherJS.<\/p>\n<p><b>Aleksey Grachev (daqui em diante \u2013 AG):<\/b> \u2013 Sou desenvolvedor Go e escrevo servi\u00e7os web em Go. \u00c0s vezes, preciso lidar com o frontend, e em algumas ocasi\u00f5es preciso entrar l\u00e1 manualmente. Quero compartilhar minhas experi\u00eancias e pesquisas sobre Go no frontend.<\/p>\n<p>A ideia \u00e9 a seguinte: primeiro falaremos sobre por que queremos rodar Go no frontend, depois discutiremos como isso pode ser feito. Existem dois caminhos \u2013 Web Assembly e GopherJS. Vamos ver em que estado esses solu\u00e7\u00f5es est\u00e3o e o que pode ser feito.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>O que h\u00e1 de errado com o frontend?<\/h3>\n<p>\nTodos concordam que est\u00e1 tudo bem com o frontend?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/065119e699053306072b1d7aa3183b34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoucos testes? Compila\u00e7\u00e3o lenta? Ecossistema? Tudo certo.<\/p>\n<p>Quanto ao frontend, gosto de uma cita\u00e7\u00e3o que um dos desenvolvedores frontend disse em seu livro:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e69eba4fc073c0b59789859c94ba29f2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJavaScript n\u00e3o tem sistema de tipos. Agora vou mencionar os problemas que encontrei ao longo do meu trabalho e explicar como eles s\u00e3o resolvidos.<\/p>\n<p>Na verdade, \u00e9 dif\u00edcil chamar o sistema de tipos de sistema de tipos em JavaScript \u2013 h\u00e1 strings que designam o tipo de objeto, mas na verdade isso n\u00e3o tem rela\u00e7\u00e3o alguma com tipos. Este problema foi resolvido no TypeScript (uma camada sobre JavaScript) e no Flow (verificador est\u00e1tico de tipos em JavaScript). Na verdade, o frontend j\u00e1 chegou \u00e0 solu\u00e7\u00e3o do problema do fraco sistema de tipos em JavaScript.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/257542cbfd2e316fbe0a0033056fff6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e3o h\u00e1 uma biblioteca padr\u00e3o no navegador como tal \u2013 existem alguns objetos embutidos e fun\u00e7\u00f5es \"m\u00e1gicas\" nos navegadores. Mas em JavaScript, a biblioteca padr\u00e3o n\u00e3o existe. Este problema j\u00e1 foi resolvido pelo jQuery (todos usavam jQuery com todos os prot\u00f3tipos, helpers, fun\u00e7\u00f5es necess\u00e1rias para funcionar). Atualmente, todos usam Lodash:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4eae8a8f19776028bd88fe8f7a751605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCallback hell. Creio que todos j\u00e1 viram c\u00f3digo em JavaScript h\u00e1 cerca de 5 anos, e ele parecia uma \"macarronada\" de callbacks incrivelmente entrela\u00e7ados. Agora, esse problema foi resolvido (com o lan\u00e7amento do ES-15 ou ES-16), promessas (promises) foram adicionadas ao JavaScript e todos puderam respirar um pouco mais f\u00e1cil por um tempo.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/96c574a880ad97e0802ae3006a60cee6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAt\u00e9 que chegou o Promice hell\u2026 N\u00e3o sei como a ind\u00fastria do frontend consegue, mas eles constantemente se empurram para caminhos estranhos. Acabaram fazendo hell at\u00e9 com \"promises\". Depois, resolveram esse problema adicionando um novo primitivo \u2013 async\/await:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/7c0679babbea4583de924292893d805c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO problema com a ass\u00edncrono est\u00e1 resolvido. Async\/await \u00e9 um primitivo bastante popular em v\u00e1rias linguagens. Em Python e em outras, existe essa abordagem \u2013 ela \u00e9 bastante boa. O problema est\u00e1 resolvido.<\/p>\n<p>Qual problema n\u00e3o foi resolvido? A crescente complexidade geom\u00e9trica dos frameworks, a complexidade do ecossistema e da pr\u00f3pria programa\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/617fbc72e9e059bf608a48c84c5328f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>A sintaxe do JavaScript \u00e9 um pouco estranha. Todos n\u00f3s conhecemos os problemas com a soma de arrays e objetos e outras peculiaridades.<\/li>\n<li>JavaScript \u00e9 multiparadigma. Agora, isso \u00e9 um sistema particularmente relevante, pois o ecossistema \u00e9 muito grande:\n<ul>\n<li>todos escrevem em estilos diferentes \u2013 alguns escrevem de forma estrutural, outros funcionalmente, diferentes desenvolvedores escrevem de maneiras diferentes;<\/li>\n<li>de diferentes pacotes (packages) v\u00eam diferentes paradigmas, quando voc\u00ea utiliza pacotes diversos;<\/li>\n<li>h\u00e1 muita 'divers\u00e3o' com programa\u00e7\u00e3o funcional em JavaScript \u2013 apareceu a biblioteca Ramda e agora ningu\u00e9m consegue ler programas escritos nessa biblioteca.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Tudo isso traz um grande impacto no ecossistema, que cresceu de forma incr\u00edvel. Os pacotes s\u00e3o incompat\u00edveis entre si: alguns usam promessas, outros async\/await, e alguns callbacks. E ainda escrevem em paradigmas diferentes!<\/li>\n<li>Isso leva a dificuldades na manuten\u00e7\u00e3o do projeto. \u00c9 complicado encontrar bugs se voc\u00ea n\u00e3o consegue ler o c\u00f3digo.<\/li>\n<\/ul>\n<p><\/p>\n<h3>O que \u00e9 Web Assembly?<\/h3>\n<p>\nOs competentes pessoal da Mozilla Foundation e de outras empresas criaram algo chamado Web Assembly. O que \u00e9 isso?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9ca5b1e0b7646ec7d6fa751d77780b41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>\u00c9 uma m\u00e1quina virtual embutida no navegador que suporta um formato bin\u00e1rio.<\/li>\n<li>Programas bin\u00e1rios v\u00e3o para l\u00e1 e s\u00e3o executados praticamente de forma nativa, ou seja, o navegador n\u00e3o precisa interpretar todo o 'macarr\u00e3o' do c\u00f3digo JavaScript a cada vez.<\/li>\n<li>Todos os navegadores declararam suporte.<\/li>\n<li>Como \u00e9 bytecode, voc\u00ea pode escrever um compilador para qualquer linguagem.<\/li>\n<li>Os quatro principais navegadores j\u00e1 v\u00eam com suporte ao Web Assembly.<\/li>\n<li>Em breve, esperamos suporte nativo em Go. Essa nova arquitetura j\u00e1 foi adicionada: GOARCH=wasm GOOS=js (em breve). Por enquanto, pelo que entendo, ela n\u00e3o est\u00e1 funcional, mas h\u00e1 uma declara\u00e7\u00e3o de que isso definitivamente estar\u00e1 no Go.<\/li>\n<\/ul>\n<p><\/p>\n<h3>O que fazer agora? GopherJS<\/h3>\n<p>\nEnquanto n\u00e3o temos suporte ao Web Assembly, existe um transpiler chamado GopherJS.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/067c1b605b220c4aeed103915daacca4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>O c\u00f3digo em Go \u00e9 transpileado para 'JavaScript limpo'.<\/li>\n<li>Ele \u00e9 executado em todos os navegadores \u2013 n\u00e3o h\u00e1 novos recursos que s\u00e3o suportados apenas por navegadores modernos (\u00e9 Vanilla JS, que roda em qualquer coisa).<\/li>\n<li>H\u00e1 suporte para quase tudo que existe no Go, incluindo goroutines e canais\u2026 \u2013 tudo o que amamos e conhecemos.<\/li>\n<li>Praticamente toda a biblioteca padr\u00e3o \u00e9 suportada, exceto aqueles pacotes que n\u00e3o fazem sentido ser suportados no navegador: syscall, intera\u00e7\u00f5es de rede (existe um cliente net\/http, mas n\u00e3o um servidor, e o cliente \u00e9 emulado atrav\u00e9s do XMLHttpRequest). Em geral, toda a biblioteca padr\u00e3o est\u00e1 dispon\u00edvel \u2013 aqui est\u00e1 ela no navegador, aqui est\u00e1 a stdlib Go que amamos.<\/li>\n<li>Todo o ecossistema de pacotes em Go, todas as solu\u00e7\u00f5es de terceiros (templatiza\u00e7\u00e3o e outras) podem ser compiladas usando GopherJS e executadas no navegador.<\/li>\n<\/ul>\n<p>\nObter GopherJS \u00e9 muito f\u00e1cil \u2013 \u00e9 um pacote Go comum. Fazemos go get e temos o comando GopherJS para compilar o aplicativo:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4f96f9e437b532f9cb1a4f960a621293.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqui est\u00e1 um pequeno hello world\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e4b56385a6cac97fc75b09584da1bfbb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026Um programa Go comum, o pacote fmt da biblioteca padr\u00e3o, e o Binding Js para acessar a API do navegador. O Println no final ser\u00e1 convertido em console log e o navegador escrever\u00e1 'Hello gophers'! \u00c9 assim t\u00e3o simples: fazemos GopherJS build \u2013 executamos no navegador \u2013 tudo funciona!<\/p>\n<h3>O que temos at\u00e9 agora? Bindings<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/6adbc1f604580c3878775c45174444a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nExistem bindings para todos os frameworks js populares:<\/p>\n<ul>\n<li>JQuery;<\/li>\n<li>Angular.js;<\/li>\n<li>D3.js para cria\u00e7\u00e3o de gr\u00e1ficos e manipula\u00e7\u00e3o de grandes dados;<\/li>\n<li>React.js;<\/li>\n<li>VueJS;<\/li>\n<li>at\u00e9 suporte para Electron (ou seja, j\u00e1 podemos escrever aplicativos desktop em 'Electron');<\/li>\n<li>e o mais divertido \u2013 \u00e9 o WebGL (podemos criar aplicativos hologr\u00e1ficos, incluindo jogos com gr\u00e1ficos 3D, m\u00fasica e todas as funcionalidades);<\/li>\n<li>e muitos outros bindings para todos os frameworks e bibliotecas javascript populares.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Framework<\/h3>\n<p><\/p>\n<ol>\n<li>J\u00e1 existe um framework web desenvolvido especificamente para GopherJS \u2013 Vecty. \u00c9 um equivalente completo do React.js, mas desenvolvido em Go, com a especificidade do GopherJS.<\/li>\n<li>Existem motores de jogo (surpreendentemente!). Eu encontrei os dois mais populares:\n<ul>\n<li>Engo;<\/li>\n<li>Ebiten.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nVou demonstrar alguns exemplos de como isso fica e o que j\u00e1 podemos escrever em Go:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/53365146c12b320fbf05334bdc6a79e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOu essa op\u00e7\u00e3o (n\u00e3o achei um jogador 3D, mas pode ser que exista):<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/b1c0a9d6d91ad8a10a9b784cd8c7b1d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>O que eu proponho?<\/h3>\n<p>\nAtualmente, a ind\u00fastria de frontend est\u00e1 em um estado em que todas as linguagens que anteriormente se lamentavam sobre Javascript est\u00e3o agora entrando. Agora todos estar\u00e3o se compilando para 'Web Assembly'. O que precisamos para ocupar um lugar digno l\u00e1 como 'gophers'?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/32c4a03f7a31def833942af6e59c70cb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo Go, \u00e9 tradicionalmente visto como uma linguagem de programa\u00e7\u00e3o de sistema, e praticamente n\u00e3o existem bibliotecas para trabalhar com UI. H\u00e1 algo, mas est\u00e1 meio abandonado e meio funcional.<\/p>\n<p>E agora \u2013 \u00e9 uma boa oportunidade para fazer bibliotecas de UI em Go, que ser\u00e3o executadas no GopherJS! Finalmente, \u00e9 poss\u00edvel escrever seu pr\u00f3prio framework! Chegou o momento em que voc\u00ea pode criar um framework que ser\u00e1 um dos primeiros e obter\u00e1 ado\u00e7\u00e3o precoce, e voc\u00ea ser\u00e1 uma estrela (se for um bom framework).<\/p>\n<p>\u00c9 poss\u00edvel adaptar uma infinidade de pacotes que j\u00e1 existem no ecossistema Go para a especificidade do navegador (por exemplo, um motor de template). Eles j\u00e1 funcionam, e voc\u00ea pode criar wrappers convenientes para renderizar conte\u00fado diretamente no navegador. Al\u00e9m disso, voc\u00ea pode criar, por exemplo, um servi\u00e7o que consiga renderizar a mesma coisa no servidor e no frontend, usando o mesmo c\u00f3digo \u2013 tudo como os desenvolvedores de frontend gostam (s\u00f3 que agora em Go).<\/p>\n<p>Voc\u00ea pode criar um jogo! Apenas por divers\u00e3o\u2026<\/p>\n<p>Isso \u00e9 tudo.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksei Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/ba08e0e65de0898e4f53abd00abb6dab.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Perguntas<\/h3>\n<p>\n<b>Pergunta (a seguir \u2013 P):<\/b> \u2013 Eu escrevo em Go ou em Js?<\/p>\n<p><b>AG:<\/b> \u2013 Voc\u00ea escreve em Go, com goroutines, canais, estruturas, embedding \u2013 tudo... Voc\u00ea se inscreve em um evento, passa uma fun\u00e7\u00e3o para l\u00e1.<\/p>\n<p><b>P:<\/b> \u2013 Ent\u00e3o, eu estou escrevendo em \"JavaScript puro\"?<\/p>\n<p><b>AG:<\/b> \u2013 N\u00e3o, voc\u00ea est\u00e1 escrevendo como se fosse em Go e se conectando \u00e0 API do navegador (a API, por sua vez, n\u00e3o mudou). Voc\u00ea pode escrever seus pr\u00f3prios wrappers para que mensagens cheguem ao canal \u2013 n\u00e3o \u00e9 dif\u00edcil.<\/p>\n<p><b>P:<\/b> \u2013 E quanto ao mobile?<\/p>\n<p><b>AG:<\/b> \u2013 Eu definitivamente vi: h\u00e1 bindings para o patch do Cordova, que o Js executa. No React Native \u2013 n\u00e3o sei; pode haver, pode n\u00e3o haver (n\u00e3o me interessei muito). O motor de jogo N-go suporta aplicativos m\u00f3veis \u2013 tanto iOS quanto Android.<\/p>\n<p><b>P:<\/b> \u2013 Pergunta sobre Web Assembly. O espa\u00e7o est\u00e1 ocupando cada vez mais, apesar da compress\u00e3o, \"zipagem\"... N\u00e3o estaremos destruindo ainda mais o mundo do frontend desse jeito?<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly \u00e9 um formato bin\u00e1rio, e bin\u00e1rio por padr\u00e3o n\u00e3o pode ser maior no release final do que texto... Voc\u00ea est\u00e1 puxando runtime, mas isso \u00e9 o mesmo que puxar a biblioteca padr\u00e3o do Javascript quando ela n\u00e3o est\u00e1 l\u00e1, ent\u00e3o usamos algum Lodash. N\u00e3o sei quanto o Lodash ocupa.<\/p>\n<p><b>P:<\/b> \u2013 Claramente menos do que o runtime\u2026<\/p>\n<p><b>AG:<\/b> \u2013 Em Javascript \"puro\"?<\/p>\n<p><b>P:<\/b> \u2013 Sim. Estamos comprimindo antes de enviar...<\/p>\n<p><b>AG:<\/b> \u2013 Mas isso \u00e9 um texto\u2026 Em geral, um megabyte parece muito, mas \u00e9 tudo (voc\u00ea tem todo o runtime). Depois, voc\u00ea escreve sua l\u00f3gica de neg\u00f3cios, que aumentar\u00e1 seu binary em 1%. At\u00e9 agora, n\u00e3o vejo isso como um problema para o frontend. Al\u00e9m disso, o Web Assembly funcionar\u00e1 mais r\u00e1pido que o Javascript por uma raz\u00e3o \u00f3bvia \u2013 ele n\u00e3o precisa ser analisado.<\/p>\n<p><b>P:<\/b> \u2013 Por enquanto, \u00e9 um ponto controverso\u2026 Ainda n\u00e3o existe uma implementa\u00e7\u00e3o padr\u00e3o do \"Vasm\" (Web Assembly) para que possamos julgar de forma inequ\u00edvoca. Conceitualmente \u2013 sim: todos n\u00f3s entendemos que o binary deve ser mais r\u00e1pido, mas a implementa\u00e7\u00e3o atual do V8 \u00e9 muito eficiente.<\/p>\n<p><b>AG:<\/b> \u2013 Sim.<\/p>\n<p><b>P:<\/b> \u2013 A compila\u00e7\u00e3o l\u00e1 realmente funciona muito bem e n\u00e3o \u00e9 fato que haver\u00e1 uma grande vantagem.<\/p>\n<p><b>AG:<\/b> \u2013 O Web Assembly tamb\u00e9m \u00e9 feito por grandes caras.<\/p>\n<p><b>P:<\/b> \u2013 Por enquanto, parece que ainda \u00e9 dif\u00edcil julgar sobre o Web Assembly. J\u00e1 h\u00e1 anos estamos discutindo, mas as realiza\u00e7\u00f5es reais que podemos tocar s\u00e3o poucas.<\/p>\n<p><b>AG:<\/b> \u2013 Tal vez. Vamos ver.<\/p>\n<p><b>P:<\/b> \u2013 N\u00e3o temos problemas no backend\u2026 Talvez, deixar esses problemas no frontend? Por que me meter l\u00e1?<\/p>\n<p><b>AG:<\/b> \u2013 Temos que manter uma equipe de frontenders.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"xF2xUKIk2MQ\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/xF2xUKIk2MQ\/hqdefault.jpg\" alt=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h3>Um pouco de publicidade \ud83d\ude42<\/h3>\n<p>\nObrigado por permanecer conosco. Voc\u00ea gosta dos nossos artigos? Quer ver mais materiais interessantes? Apoie-nos fazendo um pedido ou recomendando para conhecidos. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS em nuvem para desenvolvedores a partir de $4.99<\/a><\/noindex>, <b>uma alternativa \u00fanica aos servidores entry-level, que criamos para voc\u00ea:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Toda a verdade sobre VPS (KVM) E5-2697 v3 (6 N\u00facleos) 10GB DDR4 480GB SSD 1Gbps a partir de $19 ou como dividir um servidor corretamente?<\/a><\/noindex> (dispon\u00edveis op\u00e7\u00f5es com RAID1 e RAID10, at\u00e9 24 n\u00facleos e at\u00e9 40GB DDR4).<\/p>\n<p><b>Dell R730xd por 2 vezes mais barato no datacenter Equinix Tier IV em Amsterd\u00e3?<\/b> Somente conosco <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100TB a partir de $199<\/a><\/noindex> na Holanda! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 a partir de $99!<\/b><\/b> Leia sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Como construir uma infraestrutura de classe corporativa utilizando servidores Dell R730xd E5-2650 v4 com custo de 9000 euros por centavos?<\/a><\/noindex><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/489636\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0432\u044b \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043f\u0438\u043a\u0435\u0440\u0430 \u2013 \u041b\u0451\u0448\u0430 \u0438 \u0412\u0430\u043d\u044f. \u0411\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u0434\u0432\u0430, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0445\u0432\u0430\u0442\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u043a\u0435\u0440 \u2013 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432, \u043e\u043d \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u043e GopherJS. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u0413): \u2013 \u042f \u2013 Go-\u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440, \u0438 \u044f \u043f\u0438\u0448\u0443 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71629,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71628","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432: Go Frontend | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-27T05:51:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Aleksey Grachev: Go Frontend | ProHoster","description":"Kyiv Go Meetup Maio 2018: Apresentador: \u2013 Ol\u00e1 a todos.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u0430\u0447\u0451\u0432: Go Frontend | ProHoster","og:description":"Kyiv Go Meetup May 2018: \u0412\u0435\u0434\u0443\u0449\u0438\u0439: \u2013 \u0412\u0441\u0435\u043c.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-27T05:51:24+00:00","article:modified_time":"2020-03-03T13:14:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71628","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:58:26","updated":"2022-09-27 20:58:26","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/71628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=71628"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/71628\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/71629"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=71628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=71628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=71628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}