{"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\/no\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","title":{"rendered":"Aleksej Grachjov: Go Frontend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kyiv Go Meetup May 2018:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9974ab1db5347a41e4ec5110c3d2ef56.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Moderator:<\/b> \u2013 Hello everyone! Thank you for coming! Today we have two official speakers \u2013 Lesha and Vanya. There will be two more if we have time. The first speaker is Alexey Grachev, who will tell us about GopherJS.<\/p>\n<p><b>Alexey Grachev (hereafter \u2013 AG):<\/b> \u2013 I am a Go developer, and I write web services in Go. Sometimes I have to deal with frontend, and occasionally I dive into it myself. I want to share my experience and research on Go in frontend.<\/p>\n<p>The legend goes: first, we will discuss why we want to run Go on the frontend, then we will talk about how to do it. There are two ways \u2013 Web Assembly and GopherJS. Let's see the current state of these solutions and what can be done.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>What's wrong with the frontend?<\/h3>\n<p>\nDoes everyone agree everything is fine with the frontend?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/065119e699053306072b1d7aa3183b34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNot enough tests? Slow builds? Ecosystem issues? Good.<\/p>\n<p>Regarding the frontend, I like the quote by a frontend developer in his book:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e69eba4fc073c0b59789859c94ba29f2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJavaScript lacks a type system. Now I will name the problems I faced during my work and explain how they are solved.<\/p>\n<p>It's hard to even call it a type system in JavaScript \u2013 there are strings that denote the type of an object, but they don't really relate to types at all. This problem is solved in TypeScript (a superset of JavaScript) and Flow (a static type checker for JavaScript). Frontend has already reached a solution for the poor type system in JavaScript.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/257542cbfd2e316fbe0a0033056fff6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThere is no standard library in the browser as such \u2013 there are some built-in objects and 'magical' functions in browsers. But in JavaScript, there isn't a standard library. This problem was once solved by jQuery (everyone used jQuery with all its prototypes, helpers, and functions needed for work). Now everyone uses Lodash:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4eae8a8f19776028bd88fe8f7a751605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCallback hell. I think everyone has seen JavaScript code from about 5 years ago, and it looked like a 'noodle' of incredibly convoluted callbacks. This problem has been solved (with the release of ES-15 or ES-16); promises were added to JavaScript, and everyone could breathe a little easier for a while.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/96c574a880ad97e0802ae3006a60cee6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUntil Promise hell came\u2026 I don't know how the frontend industry manages, but they always get themselves into strange depths. They've managed to create a hell with 'promises'. Then they decided to solve this problem by adding a new primitive \u2013 async\/await:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/7c0679babbea4583de924292893d805c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblemet med asynkronitet er l\u00f8st. Async\/await er en popul\u00e6r primitiv i forskellige sprog. Der er en s\u00e5dan tilgang i Python og andre sprog \u2013 den er ganske god. Problemet er l\u00f8st.<\/p>\n<p>Hvilket problem er ikke l\u00f8st? Den stigende kompleksitet af rammer, kompleksiteten af \u00f8kosystemet og selve programmerne.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/617fbc72e9e059bf608a48c84c5328f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>JavaScript-syntaksen er lidt m\u00e6rkelig. Vi kender alle problemerne med at summere et array og et objekt og andre sjove ting.<\/li>\n<li>JavaScript er multiparadigmatisk. Det er is\u00e6r relevant nu, hvor \u00f8kosystemet er meget stort:\n<ul>\n<li>alle skriver p\u00e5 forskellige m\u00e5der \u2013 nogle skriver strukturelt, nogle skriver funktionelt, forskellige udviklere skriver forskelligt;<\/li>\n<li>fra forskellige pakker er der forskellige paradigmer, n\u00e5r du bruger forskellige pakker;<\/li>\n<li>der er meget 'sjov' med funktionel programmering i JavaScript \u2013 biblioteket Rambda er dukket op, og nu kan ingen l\u00e6se programmer skrevet med dette bibliotek.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Dette bidrager til en stor impact i \u00f8kosystemet, og det er vokset utrolig meget. Pakker er ikke kompatible med hinanden: nogle er baseret p\u00e5 promises, nogle p\u00e5 async\/await, nogle p\u00e5 callbacks. De skriver ogs\u00e5 i forskellige paradigmer!<\/li>\n<li>Dette f\u00f8rer til, at det er sv\u00e6rt at vedligeholde projektet. Det er sv\u00e6rt at finde en fejl, hvis du ikke kan l\u00e6se koden.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Hvad er Web Assembly?<\/h3>\n<p>\nDe modige fyre fra Mozilla Foundation og en r\u00e6kke andre virksomheder har opfundet noget kaldet Web Assembly. Hvad er det?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9ca5b1e0b7646ec7d6fa751d77780b41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Det er en indbygget virtuel maskine i browseren, der underst\u00f8tter bin\u00e6rt format.<\/li>\n<li>Bin\u00e6re programmer kan komme ind, og de udf\u00f8res n\u00e6sten natuligt, hvilket betyder, at browseren ikke beh\u00f8ver at parse al 'nudlerne' af JavaScript-koden hver gang.<\/li>\n<li>Alle browsere har erkl\u00e6ret st\u00f8tte.<\/li>\n<li>Da det er bytecode, kan du skrive en compiler til ethvert sprog.<\/li>\n<li>De fire st\u00f8rste browsere leveres allerede med st\u00f8tte til Web Assembly.<\/li>\n<li>Snart forventer vi nativ st\u00f8tte i Go. En ny arkitektur er allerede blevet tilf\u00f8jet: GOARCH=wasm GOOS=js (snart). Indtil videre, som jeg forst\u00e5r det, er det ikke funktionelt, men der er erkl\u00e6ringer om, at det helt klart vil v\u00e6re i Go.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Hvad skal man g\u00f8re nu? GopherJS<\/h3>\n<p>\nDa vi ikke har st\u00f8tte til Web Assembly, er der en transpiler kaldet GopherJS.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/067c1b605b220c4aeed103915daacca4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Kode i Go transpileres til 'ren' JavaScript.<\/li>\n<li>K\u00f8rer i alle browsere \u2013 der er ingen nye funktioner, der kun underst\u00f8ttes af moderne browsere (dette er Vanilla JS, der kan k\u00f8re overalt).<\/li>\n<li>Det er st\u00f8tte for nesten alt som finnes i Go, inkludert gorutiner og kanaler\u2026 \u2013 alt vi elsker og kjenner til.<\/li>\n<li>Nesten hele standardbiblioteket st\u00f8ttes, bortsett fra de pakkene som ikke gir mening \u00e5 st\u00f8tte i nettleseren: syscall, nettverksinteraksjoner (det finnes en net\/http-klient, men ingen server, og klienten emuleres via XMLHttpRequest). Generelt er hele standardbiblioteket tilgjengelig \u2013 her er det i nettleseren, her er stdlib Go, som vi elsker.<\/li>\n<li>Hele \u00f8kosystemet av pakker i Go, alle tredjepartsl\u00f8sninger (malver osv.) kan kompileres med GopherJS og kj\u00f8res i nettleseren.<\/li>\n<\/ul>\n<p>\nDet er veldig enkelt \u00e5 skaffe GopherJS \u2013 det er en vanlig Go-pakke. Vi kj\u00f8rer go get, og vi har GopherJS-kommandoen for \u00e5 bygge applikasjonen:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4f96f9e437b532f9cb1a4f960a621293.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHer er et lite hello world\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e4b56385a6cac97fc75b09584da1bfbb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026En vanlig Go-program, vanlig pakke fmt fra standardbiblioteket og Binding JS, for \u00e5 n\u00e5 ut til nettleserens API. Println vil til slutt bli konvertert til console log og nettleseren vil skrive \"Hello gophers\"! S\u00e5 enkelt: vi gj\u00f8r GopherJS build \u2013 kj\u00f8rer det i nettleseren \u2013 alt fungerer!<\/p>\n<h3>Hva er tilgjengelig p\u00e5 n\u00e5v\u00e6rende tidspunkt? Bindings<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/6adbc1f604580c3878775c45174444a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet finnes bindings for alle popul\u00e6re js-rammeverk:<\/p>\n<ul>\n<li>JQuery;<\/li>\n<li>Angular.js;<\/li>\n<li>D3.js for grafikk og arbeid med store data;<\/li>\n<li>React.js;<\/li>\n<li>VueJS;<\/li>\n<li>Det finnes til og med st\u00f8tte for Electron (det vil si at vi allerede n\u00e5 kan skrive skrivebordsapplikasjoner med \"Electron\");<\/li>\n<li>og det mest interessante \u2013 er WebGL (vi kan lage holografiske applikasjoner, inkludert spill med 3D-grafikk, musikk og alle de fine tingene);<\/li>\n<li>og mange flere bindings for alle popul\u00e6re JavaScript-rammeverk og biblioteker.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Rammeverk<\/h3>\n<p><\/p>\n<ol>\n<li>Det er utviklet et web-rammeverk spesielt for GopherJS \u2013 Vecty. Det er et fullt fungerende alternativ til React.js, men bare utviklet p\u00e5 Go, med spesifikasjoner for GopherJS.<\/li>\n<li>Det finnes spillrammer (overraskende!). Jeg fant to av de mest popul\u00e6re:\n<ul>\n<li>Engo;<\/li>\n<li>Ebiten.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nJeg vil vise et par eksempler p\u00e5 hvordan det ser ut og hva som allerede kan skrives i Go:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/53365146c12b320fbf05334bdc6a79e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEller et annet alternativ (jeg fant ingen 3D-skytespill, men kanskje det finnes):<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/b1c0a9d6d91ad8a10a9b784cd8c7b1d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Hva foresl\u00e5r jeg?<\/h3>\n<p>\nN\u00e5v\u00e6rende tilstand av frontend-industrien er slik at alle spr\u00e5k som tidligere har klaget over Javascript, n\u00e5 vil str\u00f8mme inn. N\u00e5 vil allt kompileres til \"Web Assembly\". Hva trenger vi for \u00e5 ta en respektabel plass der som \"gophers\"?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/32c4a03f7a31def833942af6e59c70cb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI Go er tradisjonelt ansett som et systemprogrammeringsspr\u00e5k, og det finnes praktisk talt ingen biblioteker for \u00e5 jobbe med UI. Det finnes noe, men det er delvis forlatt og delvis ikke-funksjonelt.<\/p>\n<p>Og n\u00e5 har vi en god mulighet til \u00e5 lage UI-biblioteker p\u00e5 Go som kan kj\u00f8res p\u00e5 GopherJS! Vi kan endelig skrive v\u00e5rt eget rammeverk! Tiden er inne for \u00e5 utvikle et rammeverk som vil v\u00e6re blant de f\u00f8rste og f\u00e5 tidlig adopsjon, og du vil bli en stjerne (hvis det er et godt rammeverk).<\/p>\n<p>Man kan tilpasse mange forskjellige pakker som allerede eksisterer i Go-\u00f8kosystemet til spesifikasjonene til nettleseren (for eksempel, malmotor). De vil allerede fungere, og vi kan lage komfortable innpakninger for \u00e5 enkelt gjengi innhold direkte i nettleseren. I tillegg kan vi lage en tjeneste som kan gjengi det samme b\u00e5de p\u00e5 serveren og p\u00e5 frontenden, ved \u00e5 bruke den samme koden \u2013 akkurat som frontend-utviklere liker det (bare n\u00e5 p\u00e5 Go).<\/p>\n<p>Vi kan lage et spill! Bare for moro...<\/p>\n<p>Jeg er ferdig.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Grachjov: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/ba08e0e65de0898e4f53abd00abb6dab.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Sp\u00f8rsm\u00e5l<\/h3>\n<p>\n<b>Sp\u00f8rsm\u00e5l (senere \u2013 S):<\/b> \u2013 Skriver jeg p\u00e5 Go eller p\u00e5 Js?<\/p>\n<p><b>AG:<\/b> \u2013 Du skriver p\u00e5 Go rutiner, kanaler, strukturer, innkapsling \u2013 alt... Du abonnerer p\u00e5 en hendelse, og sender en funksjon dit.<\/p>\n<p><b>Q:<\/b> \u2013 S\u00e5 jeg skriver p\u00e5 \u00abren\u00bb Js?<\/p>\n<p><b>AG:<\/b> \u2013 Nei, du skriver egentlig p\u00e5 Go og kobler deg til nettleserens API (API-et har ikke endret seg). Du kan lage dine egne innpakninger slik at meldinger kommer inn i kanalen \u2013 det er ikke s\u00e5 vanskelig.<\/p>\n<p><b>Q:<\/b> \u2013 Hva med mobil?<\/p>\n<p><b>AG:<\/b> \u2013 Jeg har definitivt sett: det finnes bindinger for Cordova, som Js kj\u00f8rer. N\u00e5r det gjelder React Native \u2013 jeg vet ikke; det kan eksistere, eller det kan ikke (jeg har ikke interessert meg for det). Spillmotoren N-go st\u00f8tter b\u00e5de mobilapplikasjoner \u2013 b\u00e5de iOS og Android.<\/p>\n<p><b>Q:<\/b> \u2013 Sp\u00f8rsm\u00e5l om WebAssembly. Plass kreves mer og mer, til tross for komprimering og \u00abzipede\u00bb... Vil vi ikke p\u00e5 denne m\u00e5ten \u00f8delegge frontend-verdenen enda mer?<\/p>\n<p><b>AG:<\/b> \u2013 WebAssembly er et bin\u00e6rt format, og et bin\u00e6rt format kan per definisjon ikke v\u00e6re st\u00f8rre enn teksten i den endelige utgaven... Du lengter etter runtime, men det er det samme som \u00e5 dra inn JavaScripts standardbibliotek n\u00e5r det ikke finnes, derfor bruker vi noe som Lodash. Jeg vet ikke hvor mye Lodash tar opp.<\/p>\n<p><b>Q:<\/b> \u2013 \u00c5penbart mindre enn runtime...<\/p>\n<p><b>AG:<\/b> \u2013 P\u00e5 \u00abren\u00bb Javascript?<\/p>\n<p><b>Q:<\/b> \u2013 Ja. Vi komprimerer det f\u00f8r vi sender det...<\/p>\n<p><b>AG:<\/b> \u2013 Men det er jo tekst\u2026 Generelt er megabyte mye, men det er alt (du har hele runtime tilgjengelig). Deretter skriver du din forretningslogikk, som vil \u00f8ke bin\u00e6ret ditt med 1 %. S\u00e5 langt ser jeg ikke noe som vil drepe frontenden. Dessuten vil Web Assembly kj\u00f8re raskere enn Javascript av \u00e5penbare grunner \u2013 det m\u00e5 ikke parses.<\/p>\n<p><b>Q:<\/b> \u2013 Det er fortsatt et omdiskutert punkt\u2026 Det finnes enn\u00e5 ikke en standard implementering av \u00abVasm\u00bb (Web Assembly), s\u00e5 vi kan ikke bed\u00f8mme entydig. Konseptuelt \u2013 ja: vi forst\u00e5r alle at bin\u00e6ret m\u00e5 v\u00e6re raskere, men n\u00e5v\u00e6rende implementering av V8 er veldig effektiv.<\/p>\n<p><b>AG:<\/b> \u2013 Ja.<\/p>\n<p><b>Q:<\/b> \u2013 Kompileringen der fungerer faktisk veldig bra, og det er ikke sikkert at det vil v\u00e6re en stor fordel.<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly blir ogs\u00e5 laget av store akt\u00f8rer.<\/p>\n<p><b>Q:<\/b> \u2013 For n\u00e5 virker det som det fortsatt er vanskelig \u00e5 bed\u00f8mme Web Assembly. Det har v\u00e6rt snakk om det i \u00e5revis, men det er f\u00e5 reelle fremskritt som kan tas p\u00e5.<\/p>\n<p><b>AG:<\/b> \u2013 Kanskje. Vi f\u00e5r se.<\/p>\n<p><b>Q:<\/b> \u2013 Vi har ingen problemer p\u00e5 baksiden\u2026 Skal vi kanskje la disse problemene ligge p\u00e5 frontenden? Hvorfor blande seg inn?<\/p>\n<p><b>AG:<\/b> \u2013 Vi m\u00e5 holde et team av frontendere.<\/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=\"Spill 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>Litt reklame \ud83d\ude42<\/h3>\n<p>\nTakk for at du er med oss. Liker du artiklene v\u00e5re? \u00d8nsker du \u00e5 se mer interessant materiale? St\u00f8tt oss ved \u00e5 legge inn en bestilling eller ved \u00e5 anbefale oss til kjente, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">skybaserte VPS for utviklere fra $4,99<\/a><\/noindex>, <b>en unik alternativ til entry-level servere, som vi har laget for deg:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Hele sannheten om VPS (KVM) E5-2697 v3 (6 kjerner) 10GB DDR4 480GB SSD 1Gbps fra $19 eller hvordan dele serveren riktig?<\/a><\/noindex> (tilgjengelige alternativer med RAID1 og RAID10, opptil 24 kjerner og opptil 40GB DDR4).<\/p>\n<p><b>Dell R730xd er 2 ganger billigere i Equinix Tier IV datasenteret i Amsterdam?<\/b> Bare hos oss <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 fra $199<\/a><\/noindex> i Nederland! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 fra $99!<\/b><\/b> Les om hvordan <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Bygge infrastruktur av bedriftsklasse med bruk av Dell R730xd E5-2650 v4-servere som koster 9000 euro, men til en br\u00f8kdel av prisen?<\/a><\/noindex><br \/>\n<br \/>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/aleksej-grachyov-go-frontend\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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 Mai 2018: Programleder: \u2013 Hei alle sammen.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/71628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=71628"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/71628\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/71629"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=71628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=71628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=71628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}