{"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\/it\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","title":{"rendered":"Aleksej Gra\u010d\u0451v: Go Frontend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kyiv Go Meetup Maggio 2018:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9974ab1db5347a41e4ec5110c3d2ef56.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Moderatore:<\/b> \u2013 Ciao a tutti! Grazie per essere qui! Oggi abbiamo due relatori ufficiali \u2013 Aleksei e Vania. Ce ne saranno altri due, se avremo tempo. Il primo relatore \u00e8 Aleksei Grachov, che ci parler\u00e0 di GopherJS.<\/p>\n<p><b>Aleksei Grachov (d'ora in poi \u2013 AG):<\/b> \u2013 Sono uno sviluppatore Go e scrivo servizi web in Go. A volte mi capita di dover affrontare il frontend, ogni tanto \u00e8 necessario mettere le mani direttamente l\u00ec. Voglio condividere la mia esperienza e le mie ricerche su Go nel frontend.<\/p>\n<p>La leggenda \u00e8 questa: prima parleremo di perch\u00e9 vogliamo eseguire Go nel frontend, poi discuteremo di come farlo. Ci sono due modi: Web Assembly e GopherJS. Vediamo a che punto sono queste soluzioni e cosa possiamo fare.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Qual \u00e8 il problema con il frontend?<\/h3>\n<p>\nTutti d'accordo sul fatto che con il frontend va tutto bene?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/065119e699053306072b1d7aa3183b34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPochi test? Compilazione lenta? Ecosistema? Bene.<\/p>\n<p>Per quanto riguarda il frontend, mi piace una citazione di uno degli sviluppatori frontend che ha detto nel suo libro:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e69eba4fc073c0b59789859c94ba29f2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn Javascript non esiste un sistema di tipi. Ora elencher\u00f2 i problemi che ho affrontato nel mio lavoro e spiegher\u00f2 come vengono risolti.<\/p>\n<p>Difficilmente si pu\u00f2 parlare di sistema di tipi in Javascript \u2013 ci sono delle stringhe che rappresentano il tipo di oggetto, ma in realt\u00e0 non hanno nulla a che fare con i tipi. Questo problema \u00e8 stato risolto in TypeScript (un superset di Javascript) e Flow (un controllore statico dei tipi in Javascript). In effetti, il frontend \u00e8 gi\u00e0 giunto alla risoluzione del problema di un cattivo sistema di tipi in Javascript.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/257542cbfd2e316fbe0a0033056fff6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNon esiste una libreria standard nel browser \u2013 ci sono alcuni oggetti integrati e funzioni \"magiche\" nei browser. Ma la libreria standard in Javascript, di fatto, \u00e8 assente. Questo problema era gi\u00e0 stato risolto da jQuery (tutti usavano jQuery con tutti i prototipi, helper, funzioni necessarie per il lavoro). Ora invece tutti utilizzano Lodash:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4eae8a8f19776028bd88fe8f7a751605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCallback hell. Penso che tutti abbiano visto codice Javascript circa 5 anni fa, ed era simile a una \"dripping noodle\" creata da un incredibile intrico di callback. Oggi questo problema \u00e8 stato risolto (con l'uscita di ES-15 o ES-16), sono stati aggiunti in Javascript i promesse e, per un po', \u00e8 stato pi\u00f9 facile respirare.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/96c574a880ad97e0802ae3006a60cee6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFino a quando non \u00e8 arrivato il Promice hell\u2026 Non so come l'industria frontend riesca, ma si infila sempre in qualche intrico strano. Sono riusciti a creare un hell anche con i \"promessi\". Hanno poi risolto questo problema introducendo un nuovo primitivo \u2013 async\/await:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/7c0679babbea4583de924292893d805c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl problema con l'asincronicit\u00e0 \u00e8 stato risolto. Async\/await \u00e8 un primitivo piuttosto popolare in diversi linguaggi. In Python e in altri c'\u00e8 questo approccio: \u00e8 abbastanza buono. Il problema \u00e8 risolto.<\/p>\n<p>Quale problema non \u00e8 stato risolto? L'aumento esponenziale della complessit\u00e0 dei framework, la complessit\u00e0 dell'ecosistema e dei programmi stessi.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/617fbc72e9e059bf608a48c84c5328f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>La sintassi di JavaScript \u00e8 un po' strana. Tutti conosciamo i problemi con l'aggiunta di array e oggetti e altre stranezze.<\/li>\n<li>JavaScript \u00e8 multi-paradigma. Ora \u00e8 un sistema particolarmente attuale, dato che l'ecosistema \u00e8 molto grande:\n<ul>\n<li>tutti scrivono in stili diversi: chi scrive in modo strutturato, chi in modo funzionale; diversi sviluppatori scrivono in modi diversi;<\/li>\n<li>dai diversi pacchetti (packages) derivano diversi paradigmi, quando utilizzi pacchetti diversi;<\/li>\n<li>c'\u00e8 davvero molto 'divertimento' con la programmazione funzionale in JavaScript - \u00e8 nata la libreria Ramda e ora nessuno pu\u00f2 leggere i programmi scritti con questa libreria.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Tutto ci\u00f2 porta un grande impatto nell'ecosistema, e si \u00e8 espanso in modo incredibile. I pacchetti non sono compatibili tra loro: alcuni usano le promesse, altri async\/await, altri ancora callback. E scrivono anche in diverse paradigmi!<\/li>\n<li>Questo porta a rendere difficile il supporto del progetto. \u00c8 difficile trovare bug se non riesci a leggere il codice.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Che cos'\u00e8 il Web Assembly?<\/h3>\n<p>\nI bravi ragazzi della Mozilla Foundation e di altre aziende hanno creato qualcosa chiamato Web Assembly. Che cos'\u00e8?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9ca5b1e0b7646ec7d6fa751d77780b41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>\u00c8 una macchina virtuale incorporata nel browser che supporta un formato binario.<\/li>\n<li>I programmi binari vengono trasferiti l\u00ec e vengono eseguiti quasi nativamente, quindi il browser non deve ogni volta analizzare tutta la 'pasta' di codice JavaScript.<\/li>\n<li>Tutti i browser hanno dichiarato di supportarlo.<\/li>\n<li>Poich\u00e9 si tratta di bytecode, \u00e8 possibile scrivere un compilatore per qualsiasi linguaggio.<\/li>\n<li>I quattro principali browser gi\u00e0 arrivano con il supporto per Web Assembly.<\/li>\n<li>Presto ci aspettiamo il supporto nativo anche in Go. Questa nuova architettura \u00e8 gi\u00e0 stata aggiunta: GOARCH=wasm GOOS=js (presto). Fino a ora, come ho capito, non \u00e8 funzionale, tuttavia c'\u00e8 una dichiarazione che sicuramente sar\u00e0 presente in Go.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Cosa fare ora? GopherJS<\/h3>\n<p>\nFinch\u00e9 non abbiamo il supporto per Web Assembly, c'\u00e8 un transpiler chiamato GopherJS.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/067c1b605b220c4aeed103915daacca4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Il codice Go viene transpiled in JavaScript 'pulito'.<\/li>\n<li>Funziona in tutti i browser: non ci sono nuove funzionalit\u00e0 supportate solo dai browser moderni (questo \u00e8 Vanilla JS, che funziona su qualsiasi cosa).<\/li>\n<li>C'\u00e8 supporto per quasi tutto ci\u00f2 che esiste in Go, comprese le goroutine e i canali... \u2013 tutto ci\u00f2 che amiamo e conosciamo.<\/li>\n<li>Quasi tutta la libreria standard \u00e8 supportata, ad eccezione dei pacchetti che non ha senso supportare nel browser: syscall, interazioni net (c'\u00e8 un client net\/http, ma non un server, e il client \u00e8 emulato tramite XMLHttpRequest). In generale, l'intera libreria standard \u00e8 disponibile \u2013 eccola nel browser, ecco la stdlib Go, che amiamo.<\/li>\n<li>L'intero ecosistema del pacchetto in Go, tutte le soluzioni di terze parti (template e simili) possono essere compilate utilizzando GopherJS e avviate nel browser.<\/li>\n<\/ul>\n<p>\nOttiene GopherJS \u00e8 molto facile \u2013 \u00e8 un normale pacchetto Go. Facciamo go get, e abbiamo il comando GopherJS per costruire l'applicazione:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4f96f9e437b532f9cb1a4f960a621293.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEcco un semplice hello world...<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e4b56385a6cac97fc75b09584da1bfbb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n...Un normale programma Go, un normale pacchetto fmt della libreria standard e Binding Js per accedere all'API del browser. Println sar\u00e0 alla fine convertito in console log e il browser stamper\u00e0 \u201cHello gophers\u201d! \u00c8 cos\u00ec semplice: facciamo GopherJS build \u2013 lo avviamo nel browser \u2013 tutto funziona!<\/p>\n<h3>Cosa c'\u00e8 al momento? Bindings<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/6adbc1f604580c3878775c45174444a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCi sono binding per tutti i framework js pi\u00f9 popolari:<\/p>\n<ul>\n<li>JQuery;<\/li>\n<li>Angular.js;<\/li>\n<li>D3.js per la creazione di grafici e per lavorare con i big data;<\/li>\n<li>React.js;<\/li>\n<li>VueJS;<\/li>\n<li>c'\u00e8 persino supporto per Electron (cio\u00e8 possiamo gi\u00e0 scrivere applicazioni desktop su \u00abElectron\u00bb);<\/li>\n<li>e la cosa pi\u00f9 divertente \u00e8 WebGL (possiamo creare applicazioni poligonali, comprese le giochi con grafica 3D, musica e tutte le comodit\u00e0);<\/li>\n<li>e molti altri binding per tutti i framework e librerie javascript pi\u00f9 popolari.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Framework<\/h3>\n<p><\/p>\n<ol>\n<li>Esiste gi\u00e0 un framework web progettato appositamente per GopherJS \u2013 Vecty. \u00c8 un'alternativa completa a React.js, ma sviluppata in Go, con le specifiche di GopherJS.<\/li>\n<li>Ci sono anche librerie per giochi (incredibile!). Ho trovato due delle pi\u00f9 popolari:\n<ul>\n<li>Engo;<\/li>\n<li>Ebiten.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nMostrer\u00f2 un paio di esempi, come appare e cosa si pu\u00f2 gi\u00e0 scrivere in Go:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/53365146c12b320fbf05334bdc6a79e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOppure un'altra opzione (non ho trovato uno sparatutto 3D, ma potrebbe esserci):<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/b1c0a9d6d91ad8a10a9b784cd8c7b1d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Cosa propongo?<\/h3>\n<p>\nAttualmente l'industria del front-end \u00e8 in uno stato in cui tutti i linguaggi che prima si lamentavano di Javascript vi si riverseranno. Ora tutti si compileranno in 'Web Assembly'. Cosa ci serve per guadagnare l\u00ec un posto d'onore come 'gophers'?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/32c4a03f7a31def833942af6e59c70cb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn Go \u00e8 tradizionalmente riconosciuto come un linguaggio di programmazione di sistema, e praticamente non esistono librerie per lavorare con l'interfaccia utente. Qualcosa c'\u00e8, ma \u00e8 per met\u00e0 abbandonata e per met\u00e0 non funzionante.<\/p>\n<p>Ecco un'ottima opportunit\u00e0 per sviluppare librerie UI in Go, che possano essere eseguite su GopherJS! Finalmente \u00e8 possibile scrivere il proprio framework! \u00c8 arrivato il momento in cui si pu\u00f2 creare un framework ed esso sar\u00e0 uno dei primi ad essere adottato precocemente, e diventerai una star (se sar\u00e0 un buon framework).<\/p>\n<p>\u00c8 possibile adattare un'enorme quantit\u00e0 di pacchetti gi\u00e0 esistenti nell'ecosistema di Go alle specificit\u00e0 del browser (ad esempio, un motore di template). Gi\u00e0 funzionano, si possono creare facciate comode per rendere facile il rendering dei contenuti direttamente nel browser. Inoltre, si potrebbe realizzare un servizio in grado di renderizzare la stessa cosa sia sul server che sul front-end, usando lo stesso codice \u2013 tutto ci\u00f2 che i developer front-end amano (solo che ora \u00e8 su Go).<\/p>\n<p>Si pu\u00f2 scrivere un gioco! Just for fun\u2026<\/p>\n<p>Questo \u00e8 tutto da parte mia.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Gra\u010d\u0451v: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/ba08e0e65de0898e4f53abd00abb6dab.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Domande<\/h3>\n<p>\n<b>Domanda (di seguito \u2013 D):<\/b> \u2013 Scrivo in Go o in Js?<\/p>\n<p><b>AG:<\/b> \u2013 Scrivi in Go, routine, canali, strutture, embedding \u2013 tutto\u2026 Ti iscrivi a un evento, passando la funzione l\u00ec.<\/p>\n<p><b>D:<\/b> \u2013 Quindi scrivo in 'nudo' Js?<\/p>\n<p><b>AG:<\/b> \u2013 No, scrivi in una sorta di Go e ti connetti all'API del browser (l'API non \u00e8 cambiata). Puoi scrivere le tue facciate affinch\u00e9 nel canale arrivino i messaggi \u2013 non \u00e8 difficile.<\/p>\n<p><b>D:<\/b> \u2013 E per quanto riguarda il mobile?<\/p>\n<p><b>AG:<\/b> \u2013 Ho visto che ci sono binding per il plugin Cordova, che l'Js lancia. In React Native \u2013 non lo so; forse ci sono, forse no (non mi sono informato molto). Il motore di gioco N-go supporta anche le applicazioni mobili \u2013 sia iOS che Android.<\/p>\n<p><b>D:<\/b> \u2013 Domanda su Web Assembly. Sta prendendo sempre pi\u00f9 spazio, nonostante la compressione, la 'zip-azione'... Non rischiamo di uccidere ulteriormente il mondo del front-end in questo modo?<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly \u00e8 un formato binario, e di default un binario non pu\u00f2 occupare pi\u00f9 spazio nel rilascio finale rispetto al testo... Ti attira il runtime, ma \u00e8 lo stesso che cercare di includere la libreria standard di Javascript quando non ci sono, quindi usiamo qualche tipo di Lodash. Non so quanto occupi Lodash.<\/p>\n<p><b>D:<\/b> \u2013 Sicuramente meno del runtime\u2026<\/p>\n<p><b>AG:<\/b> \u2013 In 'puro' Javascript?<\/p>\n<p><b>D:<\/b> \u2013 S\u00ec. Infatti lo comprimiamo prima di inviarlo...<\/p>\n<p><b>AG:<\/b> \u2013 Ma questo \u00e8 un testo\u2026 In generale, un megabyte sembra tanto, ma \u00e8 tutto (hai il tuo runtime). Poi scrivi la tua logica di business, che aumenter\u00e0 del 1% il tuo binary. Finora non vedo come questo possa compromettere il frontend. Inoltre, Web Assembly funzioner\u00e0 pi\u00f9 velocemente di Javascript per un motivo evidente: non deve essere parsato.<\/p>\n<p><b>D:<\/b> \u2013 \u00c8 ancora un punto controverso\u2026 Non c'\u00e8 ancora una qualche implementazione standard di \"Wasm\" (Web Assembly), quindi non si pu\u00f2 giudicare senza ambiguit\u00e0. Concettualmente, s\u00ec: tutti capiamo che il binary dovrebbe essere pi\u00f9 veloce, ma l'attuale implementazione dello stesso V8 \u00e8 molto efficiente.<\/p>\n<p><b>AG:<\/b> \u2013 S\u00ec.<\/p>\n<p><b>D:<\/b> \u2013 La compilazione l\u00ec funziona davvero molto bene e non \u00e8 detto che ci saranno grossi vantaggi.<\/p>\n<p><b>AG:<\/b> \u2013 Anche Web Assembly \u00e8 sviluppato da grandi aziende.<\/p>\n<p><b>D:<\/b> \u2013 Finora, mi sembra ancora difficile giudicare Web Assembly. Da quanti anni si discute di questo, e i risultati concreti che possiamo toccare sono pochi.<\/p>\n<p><b>AG:<\/b> \u2013 Forse. Vedremo.<\/p>\n<p><b>D:<\/b> \u2013 Non abbiamo problemi sul backend\u2026 Potremmo lasciarli nel frontend? Perch\u00e9 interferire?<\/p>\n<p><b>AG:<\/b> \u2013 Dobbiamo mantenere un team di frontend.<\/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=\"Guarda il 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 po' di pubblicit\u00e0 \ud83d\ude42<\/h3>\n<p>\nGrazie per rimanere con noi. Ti piacciono i nostri articoli? Vuoi vedere pi\u00f9 contenuti interessanti? Supportaci effettuando un ordine o raccomandandoci a qualcuno. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS cloud per sviluppatori a partire da $4.99.<\/a><\/noindex>, <b>unica alternativa ai server entry-level, concepita da noi per te:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Tutta la verit\u00e0 sui VPS (KVM) E5-2697 v3 (6 Core) 10GB DDR4 480GB SSD 1Gbps a partire da $19 o come dividere correttamente un server?<\/a><\/noindex> (sono disponibili opzioni con RAID1 e RAID10, fino a 24 core e fino a 40GB DDR4).<\/p>\n<p><b>Dell R730xd a met\u00e0 prezzo nel data center Equinix Tier IV ad Amsterdam?<\/b> Solo da noi <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 a partire da $199<\/a><\/noindex> nei Paesi Bassi! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 a partire da $99!<\/b><\/b> Leggi di <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Come costruire un'infrastruttura di livello enterprise utilizzando server Dell R730xd E5-2650 v4 del valore di 9000 euro a pochi spiccioli?<\/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.1.1 - 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\/it\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Aleksej Gra\u010d\u00ebv: Go Frontend | ProHoster","description":"Kyiv Go Meetup Maggio 2018: Moderatore: \u2013 Ciao a tutti.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/71628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=71628"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/71628\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/71629"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=71628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=71628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=71628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}