{"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\/es\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","title":{"rendered":"Aleksey Grachev: Go Frontend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kyiv Go Meetup Mayo 2018:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9974ab1db5347a41e4ec5110c3d2ef56.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Presentador:<\/b> \u2013 \u00a1Hola a todos! Gracias por estar aqu\u00ed. Hoy tenemos dos ponentes oficiales \u2013 Alyosha y Vanya. Habr\u00e1 otros dos, si tenemos tiempo. El primer ponente es Alexey Grachev, que nos hablar\u00e1 sobre GopherJS.<\/p>\n<p><b>Alexey Grachev (en adelante \u2013 AG):<\/b> \u2013 Soy desarrollador de Go y escribo servicios web en Go. A veces, tengo que lidiar con el frontend, y a veces tengo que meterme all\u00ed personalmente. Quiero compartir mi experiencia e investigaciones sobre Go en el frontend.<\/p>\n<p>La leyenda es la siguiente: primero hablaremos de por qu\u00e9 queremos ejecutar Go en el frontend, luego veremos c\u00f3mo se puede hacer. Hay dos enfoques \u2013 Web Assembly y GopherJS. Veremos en qu\u00e9 estado se encuentran estas soluciones y qu\u00e9 se puede hacer.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>\u00bfQu\u00e9 pasa con el frontend?<\/h3>\n<p>\n\u00bfTodos est\u00e1n de acuerdo en que todo est\u00e1 bien con el frontend?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/065119e699053306072b1d7aa3183b34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00bfHay pocas pruebas? \u00bfCompilaci\u00f3n lenta? \u00bfEcosistema? Est\u00e1 bien.<\/p>\n<p>Con respecto al frontend, me gusta una cita que dijo uno de los desarrolladores frontend en su libro:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e69eba4fc073c0b59789859c94ba29f2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn Javascript no hay un sistema de tipos. Ahora voy a mencionar los problemas con los que me he encontrado por el camino y explicar c\u00f3mo se resuelven.<\/p>\n<p>Dif\u00edcilmente se puede llamar a esto un sistema de tipos en Javascript; hay cadenas que indican el tipo de objeto, pero en realidad no tienen nada que ver con los tipos. Este problema se resuelve en TypeScript (una capa sobre Javascript) y Flow (revisor est\u00e1tico de tipos en Javascript). De hecho, ya se ha avanzado en la resoluci\u00f3n del problema de un mal sistema de tipos en Javascript.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/257542cbfd2e316fbe0a0033056fff6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo hay una biblioteca est\u00e1ndar en el navegador como tal; hay algunos objetos incorporados y funciones 'm\u00e1gicas' en los navegadores. Pero en Javascript como tal, la biblioteca est\u00e1ndar est\u00e1 ausente. Este problema fue resuelto alguna vez por jQuery (todos usaban jQuery con todos sus prototipos, helpers, y funciones necesarias para el trabajo). Ahora todos usan Lodash:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4eae8a8f19776028bd88fe8f7a751605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInfierno de callbacks. Creo que todos han visto c\u00f3digo en Javascript hace unos 5 a\u00f1os, y se parec\u00eda a un 'tallar\u00edn' de una incre\u00edble enredadera de callbacks. Ahora este problema se ha resuelto (con la llegada de ES-15 o ES-16); se a\u00f1adieron promesas (promises) a Javascript y todos respiraron un poco m\u00e1s tranquilos durante un tiempo.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/96c574a880ad97e0802ae3006a60cee6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHasta que lleg\u00f3 el infierno de las promesas... No s\u00e9 c\u00f3mo la industria del frontend se las arregla, pero siempre se meten en algunas extra\u00f1as encrucijadas. Lograron crear el infierno de las 'promesas'. Luego resolvieron este problema a\u00f1adiendo un nuevo primitivo \u2013 async\/await:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/7c0679babbea4583de924292893d805c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl problema de la asincron\u00eda est\u00e1 solucionado. Async\/await es un primitivo bastante popular en diferentes lenguajes. En Python y en otros tambi\u00e9n hay un enfoque as\u00ed, y es bastante bueno. El problema est\u00e1 resuelto.<\/p>\n<p>\u00bfQu\u00e9 problema no est\u00e1 resuelto? La creciente complejidad de los frameworks en progresi\u00f3n geom\u00e9trica, la complejidad del ecosistema y la programaci\u00f3n en s\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/617fbc72e9e059bf608a48c84c5328f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>La sintaxis de Javascript es un poco extra\u00f1a. Todos conocemos los problemas con la suma de arrays y objetos y otros detalles interesantes.<\/li>\n<li>Javascript es multiparadigma. Actualmente es un sistema especialmente relevante, ya que el ecosistema es muy grande:\n<ul>\n<li>todos escriben de diferentes maneras: algunos escriben de forma estructurada, otros de manera funcional, diferentes desarrolladores escriben de manera diferente;<\/li>\n<li>de diferentes paquetes (packages) hay diferentes paradigmas, cuando utilizas diferentes paquetes;<\/li>\n<li>hay mucha 'diversi\u00f3n' con la programaci\u00f3n funcional en Javascript: apareci\u00f3 la biblioteca Ramda y ahora nadie puede entender programas escritos con esta biblioteca.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Todo esto tiene un gran impacto en el ecosistema, y ha crecido incre\u00edblemente. Los paquetes son incompatibles entre s\u00ed: algunos usan promesas, otros async\/await, otros callbacks. \u00a1Tambi\u00e9n se escribe en diferentes paradigmas!<\/li>\n<li>Esto lleva a que el proyecto sea dif\u00edcil de mantener. Es complicado encontrar un bug si no puedes leer el c\u00f3digo.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00bfQu\u00e9 es Web Assembly?<\/h3>\n<p>\nLos valientes de la Mozilla Foundation y varias otras compa\u00f1\u00edas han ideado algo llamado Web Assembly. \u00bfQu\u00e9 es?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9ca5b1e0b7646ec7d6fa751d77780b41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Es una m\u00e1quina virtual integrada en el navegador que soporta un formato binario.<\/li>\n<li>Los programas binarios llegan all\u00ed y se ejecutan pr\u00e1cticamente de forma nativa, es decir, el navegador no necesita parsear cada vez todo el 'espagueti' del c\u00f3digo javascript.<\/li>\n<li>Todos los navegadores han declarado su soporte.<\/li>\n<li>Dado que es bytecode, se puede escribir un compilador para cualquier lenguaje.<\/li>\n<li>Los cuatro principales navegadores ya vienen con soporte para Web Assembly.<\/li>\n<li>Pronto esperamos soporte nativo en Go. Una nueva arquitectura ya se ha a\u00f1adido: GOARCH=wasm GOOS=js (pronto). Hasta ahora, seg\u00fan entiendo, no es funcional, pero hay declaraci\u00f3n de que definitivamente estar\u00e1 en Go.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00bfQu\u00e9 hacer ahora? GopherJS<\/h3>\n<p>\nMientras no tengamos soporte para Web Assembly, hay un transpiler llamado GopherJS.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/067c1b605b220c4aeed103915daacca4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>El c\u00f3digo en Go se transpila a Javascript 'limpio'.<\/li>\n<li>Se ejecuta en todos los navegadores: no hay nuevas caracter\u00edsticas que solo est\u00e1n soportadas por navegadores modernos (esto es Vanilla JS, que se ejecuta en cualquier cosa).<\/li>\n<li>Hay soporte para casi todo lo que existe en Go, incluidas las gorutinas y los canales... todo lo que amamos y conocemos.<\/li>\n<li>Casi toda la biblioteca est\u00e1ndar es compatible, excepto aquellos paquetes que no tienen sentido soportar en el navegador: syscall, interacciones de red (hay un cliente net\/http, pero no hay servidor, y el cliente se emula a trav\u00e9s de XMLHttpRequest). En general, toda la biblioteca est\u00e1ndar est\u00e1 disponible: aqu\u00ed est\u00e1 en el navegador, aqu\u00ed est\u00e1 la stdlib Go que tanto queremos.<\/li>\n<li>Todo el ecosistema del paquete en Go, todas las soluciones de terceros (templatizaci\u00f3n y dem\u00e1s) se pueden compilar usando GopherJS y ejecutar en el navegador.<\/li>\n<\/ul>\n<p>\nObtener GopherJS es muy f\u00e1cil: es un paquete com\u00fan de Go. Hacemos go get y tenemos el comando GopherJS para construir la aplicaci\u00f3n:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4f96f9e437b532f9cb1a4f960a621293.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqu\u00ed hay un peque\u00f1o hello world...<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e4b56385a6cac97fc75b09584da1bfbb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n...Una aplicaci\u00f3n Go com\u00fan, el paquete fmt de la biblioteca est\u00e1ndar y Binding Js, para acceder a la API del navegador. Println se transformar\u00e1 en un registro de consola y el navegador mostrar\u00e1 \u201c\u00a1Hola gophers\u201d! As\u00ed de simple: hacemos GopherJS build, lo ejecutamos en el navegador y \u00a1todo funciona!<\/p>\n<h3>\u00bfQu\u00e9 hay en este momento? Bindings<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/6adbc1f604580c3878775c45174444a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHay bindings para todos los frameworks de js populares:<\/p>\n<ul>\n<li>JQuery;<\/li>\n<li>Angular.js;<\/li>\n<li>D3.js para crear gr\u00e1ficos y trabajar con grandes datos;<\/li>\n<li>React.js;<\/li>\n<li>VueJS;<\/li>\n<li>incluso hay soporte para Electron (es decir, ya podemos escribir aplicaciones de escritorio en \u2018Electron\u2019);<\/li>\n<li>y lo m\u00e1s divertido es WebGL (podemos hacer aplicaciones poligonales, incluyendo juegos con gr\u00e1ficos 3D, m\u00fasica y todos los extras);<\/li>\n<li>y muchos otros bindings para todos los frameworks y bibliotecas de javascript populares.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Framework<\/h3>\n<p><\/p>\n<ol>\n<li>Ya existe un framework web desarrollado espec\u00edficamente para GopherJS: Vecty. Es un an\u00e1logo completo de React.js, pero dise\u00f1ado en Go, con las especificaciones de GopherJS.<\/li>\n<li>Hay motores de juego (sorpresivamente). Encontr\u00e9 los dos m\u00e1s populares:\n<ul>\n<li>Engo;<\/li>\n<li>Ebiten.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nVoy a mostrar un par de ejemplos de c\u00f3mo se ve esto y qu\u00e9 se puede escribir ahora en Go:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/53365146c12b320fbf05334bdc6a79e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO esta opci\u00f3n (no encontr\u00e9 un shooter 3D, pero quiz\u00e1s exista):<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/b1c0a9d6d91ad8a10a9b784cd8c7b1d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00bfQu\u00e9 propongo?<\/h3>\n<p>\nAhora la industria del frontend est\u00e1 en un estado en el que todos los lenguajes que antes se quejaban de Javascript van a unirse. Ahora todos se compilar\u00e1n en \u2018Web Assembly\u2019. \u00bfQu\u00e9 necesitamos para ocupar un lugar digno all\u00ed como \u2018gophers\u2019?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/32c4a03f7a31def833942af6e59c70cb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn Go, tradicionalmente se considera que es un lenguaje de programaci\u00f3n de sistemas, y pr\u00e1cticamente no hay bibliotecas para trabajar con la interfaz de usuario. Hay algo, pero est\u00e1 medio abandonado y medio no funcional.<\/p>\n<p>Y aqu\u00ed viene una buena oportunidad para crear bibliotecas de interfaz de usuario en Go que se ejecuten en GopherJS. \u00a1Finalmente, se puede escribir un marco propio! Ha llegado el momento de crear un marco que ser\u00e1 uno de los primeros en recibir adopci\u00f3n temprana y te convertir\u00e1 en una estrella (si es un buen marco).<\/p>\n<p>Se pueden adaptar muchos paquetes diferentes que ya existen en el ecosistema de Go a las especificaciones del navegador (por ejemplo, motores de plantillas). Ya funcionar\u00e1n, se pueden hacer envolturas convenientes para poder renderizar contenido directamente en el navegador. Adem\u00e1s, se puede hacer, por ejemplo, un servicio que pueda renderizar lo mismo en el servidor y en el frontend, usando el mismo c\u00f3digo, como a los desarrolladores frontend les gusta (solo que ahora en Go).<\/p>\n<p>\u00a1Se puede escribir un videojuego! Solo por diversi\u00f3n...<\/p>\n<p>Eso es todo.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/ba08e0e65de0898e4f53abd00abb6dab.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Preguntas<\/h3>\n<p>\n<b>Pregunta (en adelante - P):<\/b> \u2013 \u00bfEscribo en Go o en Js?<\/p>\n<p><b>AG:<\/b> \u2013 Escribes en Go rutinas, canales, estructuras, embedding \u2013 todo\u2026 Te suscribes a un evento, pasas all\u00ed una funci\u00f3n.<\/p>\n<p><b>Q:<\/b> \u2013 \u00bfEs decir que escribo en \u00abpuro\u00bb Js?<\/p>\n<p><b>AG:<\/b> \u2013 No, escribes como si fuera en Go y te conectas a la API del navegador (la API no ha cambiado). Puedes escribir tus envolturas para que los mensajes lleguen al canal \u2013 no es dif\u00edcil.<\/p>\n<p><b>Q:<\/b> \u2013 \u00bfY qu\u00e9 pasa con lo m\u00f3vil?<\/p>\n<p><b>AG:<\/b> \u2013 He visto: hay bindings para el parche Cordova que ejecuta Js. En React Native \u2013 no lo s\u00e9; puede que haya, o puede que no (no me he interesado mucho). El motor de videojuegos N-go admite aplicaciones m\u00f3viles \u2013 tanto iOS como Android.<\/p>\n<p><b>Q:<\/b> \u2013 Pregunta sobre Web Assembly. El espacio est\u00e1 ocupando cada vez m\u00e1s, a pesar de la compresi\u00f3n, el \"zipping\"... \u00bfNo arruinaremos as\u00ed a\u00fan m\u00e1s el mundo del frontend?<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly es un formato binario, y un binario por defecto no puede ser m\u00e1s grande que texto en la versi\u00f3n final... Te atrae el runtime, pero es lo mismo que tirar de la biblioteca est\u00e1ndar de Javascript cuando no est\u00e1, as\u00ed que usamos alguna Lodash. No s\u00e9 cu\u00e1nto ocupa Lodash.<\/p>\n<p><b>Q:<\/b> Claramente menos que el runtime...<\/p>\n<p><b>AG:<\/b> \u2013 \u00bfEn Javascript \"puro\"?<\/p>\n<p><b>Q:<\/b> \u2013 S\u00ed. Lo comprimimos antes de enviarlo...<\/p>\n<p><b>AG:<\/b> \u2013 Pero esto es texto... En general, un megabyte parece mucho, pero eso es todo (tienes todo el runtime). Luego, escribes tu l\u00f3gica de negocio, que incrementar\u00e1 tu binario en un 1%. Hasta ahora no veo que esto mate el frontend. Adem\u00e1s, Web Assembly funcionar\u00e1 m\u00e1s r\u00e1pido que Javascript por una raz\u00f3n obvia: no necesita ser analizado.<\/p>\n<p><b>Q:<\/b> \u2013 Es un tema discutible... A\u00fan no hay una implementaci\u00f3n est\u00e1ndar de 'Wasmer' (Web Assembly) para poder juzgar de manera definitiva. Conceptualmente, s\u00ed: todos entendemos que el binario deber\u00eda ser m\u00e1s r\u00e1pido, pero la implementaci\u00f3n actual de V8 es muy eficiente.<\/p>\n<p><b>AG:<\/b> \u2013 S\u00ed.<\/p>\n<p><b>Q:<\/b> \u2013 La compilaci\u00f3n all\u00ed realmente funciona muy bien y no est\u00e1 claro que haya una gran ventaja.<\/p>\n<p><b>AG:<\/b> \u2013 Tambi\u00e9n hay grandes jugadores detr\u00e1s de Web Assembly.<\/p>\n<p><b>Q:<\/b> \u2013 Hasta ahora, me parece que a\u00fan es dif\u00edcil juzgar Web Assembly. Han pasado a\u00f1os hablando de esto, y hay pocos logros tangibles.<\/p>\n<p><b>AG:<\/b> \u2013 Tal vez. Tendremos que esperar y ver.<\/p>\n<p><b>Q:<\/b> \u2013 No tenemos problemas en el backend... \u00bfPodr\u00edamos dejar esos problemas en el frontend? \u00bfPor qu\u00e9 meterse all\u00ed?<\/p>\n<p><b>AG:<\/b> \u2013 Hay que mantener un equipo 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=\"Reproducir video\" 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>Un poco de publicidad \ud83d\ude42<\/h3>\n<p>\nGracias por permanecer con nosotros. \u00bfTe gustan nuestros art\u00edculos? \u00bfQuieres ver m\u00e1s contenido interesante? Ap\u00f3yanos haciendo un pedido o recomendando a tus conocidos, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS en la nube para desarrolladores desde $4.99<\/a><\/noindex>, <b>un an\u00e1logo \u00fanico de servidores entry-level que hemos dise\u00f1ado para Ti:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Toda la verdad sobre VPS (KVM) E5-2697 v3 (6 n\u00facleos) 10GB DDR4 480GB SSD 1Gbps desde $19, o c\u00f3mo dividir correctamente un servidor?<\/a><\/noindex> (disponibles opciones con RAID1 y RAID10, hasta 24 n\u00facleos y hasta 40GB DDR4).<\/p>\n<p><b>\u00bfDell R730xd a mitad de precio en el centro de datos Equinix Tier IV en \u00c1msterdam?<\/b> Solo aqu\u00ed <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 100 TB desde $199<\/a><\/noindex> \u00a1en los Pa\u00edses Bajos! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 \u00a1desde $99!<\/b><\/b> Lee sobre c\u00f3mo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Construir infraestructura de clase empresarial usando servidores Dell R730xd E5-2650 v4 que cuestan 9000 euros a un precio asequible?<\/a><\/noindex><br \/>\n<br \/>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Alexey Grachev: Go Frontend | ProHoster","description":"Kyiv Go Meetup mayo 2018: Presentador: \u2013 Hola a todos.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/71628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=71628"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/71628\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/71629"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=71628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=71628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=71628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}