{"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\/en\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","title":{"rendered":"Alexey Grachev: Go Frontend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kyiv Go Meetup May 2018:<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9974ab1db5347a41e4ec5110c3d2ef56.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Host:<\/b> \u2013 Hello everyone! Thank you for gathering here! Today we have two official speakers \u2013 Alex and Vanya. There will be two more if we have enough 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 the frontend, and I occasionally dive into it hands-on. I want to share my experience and research on Go in the frontend.<\/p>\n<p>The legend goes: first, we'll talk about why we want to run Go on the frontend, then we'll discuss how to do it. There are two paths \u2013 Web Assembly and GopherJS. Let's see the 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 that everything is fine with the frontend?<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: 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? Good.<\/p>\n<p>Regarding the frontend, I like a quote from one of the frontend developers in his book:<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: 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 encountered along the way and explain how they are solved.<\/p>\n<p>The type system can hardly be called a type system in Javascript \u2013 there are strings that denote the type of an object, but in reality, it has nothing to do with types. This problem is addressed in TypeScript (a superset of Javascript) and Flow (a static type checker in Javascript). In fact, the frontend has already reached a solution to the problem of poor type systems in Javascript.<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: 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 as for standard libraries, they are absent in Javascript itself. This problem was once solved by jQuery (everyone used jQuery with all the prototypes, helpers, and functions needed for work). Now everyone uses Lodash:<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: 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 tangled callbacks. This problem is now resolved (with the release of ES-15 or ES-16), promises were added to Javascript, and for a while, it became easier to breathe.<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/96c574a880ad97e0802ae3006a60cee6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUntil Promise hell came... I don't know how the frontend industry manages, but they keep digging themselves into strange pits. They even managed to create hell with 'promises'. Then they decided this issue by adding a new primitive \u2013 async\/await:<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/7c0679babbea4583de924292893d805c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe problem with asynchronicity is solved. Async\/await is a fairly popular primitive in different languages. In Python and others, there is such an approach \u2013 it's quite effective. The problem is resolved.<\/p>\n<p>What problem remains unsolved? The exponentially increasing complexity of frameworks, the complexity of the ecosystem, and the programs themselves.<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/617fbc72e9e059bf608a48c84c5328f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>The syntax of JavaScript is somewhat peculiar. We all know the issues with adding arrays and objects and other quirks.<\/li>\n<li>JavaScript is multi-paradigm. Right now, this is particularly pressing since the ecosystem is very large:\n<ul>\n<li>everyone writes in different styles \u2013 some write structurally, others functionally; different developers have different approaches;<\/li>\n<li>from different packages, there are varying paradigms when you use different libraries;<\/li>\n<li>there's a lot of 'fun' with functional programming in JavaScript \u2013 a library called Ramda emerged, and now no one can read programs written with this library.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>All this significantly impacts the ecosystem, and it has grown immensely. Packages are incompatible with each other: some use promises, some use async\/await, others rely on callbacks. They also write in different paradigms!<\/li>\n<li>This leads to the project being difficult to maintain. It's hard to find bugs if you can't read the code.<\/li>\n<\/ul>\n<p><\/p>\n<h3>What is Web Assembly?<\/h3>\n<p>\nThe brave folks from the Mozilla Foundation and several other companies came up with something called Web Assembly. What is it?<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/9ca5b1e0b7646ec7d6fa751d77780b41.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>It's a virtual machine built into the browser that supports a binary format.<\/li>\n<li>Binary programs enter it and are executed almost natively, meaning the browser doesn't need to parse the entire 'noodle' of JavaScript code each time.<\/li>\n<li>All browsers have announced support.<\/li>\n<li>Since this is bytecode, a compiler can be written for any language.<\/li>\n<li>The four main browsers already come with support for Web Assembly.<\/li>\n<li>We expect native support in Go soon. This new architecture has already been added: GOARCH=wasm GOOS=js (soon). For now, as I understand, it is not functional; however, there is a statement that this will definitely be in Go.<\/li>\n<\/ul>\n<p><\/p>\n<h3>What to do now? GopherJS.<\/h3>\n<p>\nWhile we don't have support for Web Assembly, there is a transpiler called GopherJS.<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/067c1b605b220c4aeed103915daacca4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Code in Go transpiles to 'pure' JavaScript.<\/li>\n<li>It runs in all browsers \u2013 there are no new features that are only supported by modern browsers (it's Vanilla JS, which can run on anything).<\/li>\n<li>There is support for almost everything that exists in Go, including goroutines and channels... everything we love and know.<\/li>\n<li>Almost the entire standard library is supported, except for those packages that make no sense to support in the browser: syscall, net interactions (there is a net\/http client, but no server, and the client is emulated through XMLHttpRequest). Overall, the entire standard library is available \u2013 here it is in the browser, here is the Go stdlib that we love.<\/li>\n<li>The entire ecosystem of Go packages, all third-party solutions (templating, etc.) can be compiled using GopherJS and run in the browser.<\/li>\n<\/ul>\n<p>\nGetting GopherJS is very easy \u2013 it\u2019s a regular Go package. Just do go get, and we have the GopherJS command to build the application:<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/4f96f9e437b532f9cb1a4f960a621293.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHere\u2019s a simple hello world...<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/e4b56385a6cac97fc75b09584da1bfbb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n...A regular Go program, a regular fmt package from the standard library, and Binding Js to access the browser API. Println will eventually be converted to console log, and the browser will print 'Hello gophers'! It's that simple: we do GopherJS build \u2013 run it in the browser \u2013 and everything works!<\/p>\n<h3>What is available at the moment? Bindings<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/6adbc1f604580c3878775c45174444a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThere are bindings to all popular js frameworks:<\/p>\n<ul>\n<li>JQuery;<\/li>\n<li>Angular.js;<\/li>\n<li>D3.js for graphing and working with big data;<\/li>\n<li>React.js;<\/li>\n<li>VueJS;<\/li>\n<li>there\u2019s even support for Electron (meaning we can already write desktop applications in 'Electron');<\/li>\n<li>and the funniest part is WebGL (we can create photorealistic applications, including games with 3D graphics, music, and all the bells and whistles);<\/li>\n<li>and many other bindings to all popular JavaScript frameworks and libraries.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Framework<\/h3>\n<p><\/p>\n<ol>\n<li>There is already a web framework developed specifically for GopherJS \u2013 Vecty. It is a full-fledged analogue of React.js, but developed in Go, with GopherJS specifics.<\/li>\n<li>There are game engines (surprisingly!). I found the two most popular ones:\n<ul>\n<li>Engo;<\/li>\n<li>Ebiten.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nI will demonstrate a couple of examples of what this looks like and what can already be written in Go:<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/53365146c12b320fbf05334bdc6a79e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOr this option (couldn't find a 3D shooter, but perhaps it exists):<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/b1c0a9d6d91ad8a10a9b784cd8c7b1d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>What do I propose?<\/h3>\n<p>\nThe frontend industry is currently in a state where all languages that have previously suffered because of JavaScript will now rush in. Now everyone will be compiled into 'Web Assembly'. What do we need to secure a worthy place there as 'gophers'?<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/32c4a03f7a31def833942af6e59c70cb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn Go, it has traditionally been thought of as a System programming language, and there are practically no libraries for working with the UI. There are some, but they are half-abandoned and half-nonfunctional.<\/p>\n<p>And here\u2019s a great opportunity to create UI libraries in Go that will run on GopherJS! Finally, you can write your own framework! It\u2019s time to write a framework, and it will be one of the first and gain early adoption, and you'll be a star (if it's a good framework).<\/p>\n<p>You can adapt a ton of different packages that already exist in the Go ecosystem to the specifics of the browser (for example, a Template engine). They will already work; you can create convenient wrappers so that content can be easily rendered right in the browser. Plus, you can make a service that can render the same thing on the server and on the frontend using the same code \u2013 just like frontend developers love (only now in Go).<\/p>\n<p>You can write a game! Just for fun\u2026<\/p>\n<p>That's all from me.<\/p>\n<p><img decoding=\"async\" alt=\"Alexey Grachev: Go Frontend\" src=\"\/wp-content\/uploads\/2020\/02\/ba08e0e65de0898e4f53abd00abb6dab.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Questions<\/h3>\n<p>\n<b>Question (hereafter \u2013 Q):<\/b> \u2013 Am I writing in Go or Js?<\/p>\n<p><b>AG:<\/b> \u2013 You are writing Go routines, channels, structures, embedding \u2013 everything... You subscribe to an event, passing a function there.<\/p>\n<p><b>Q:<\/b> \u2013 So I\u2019m writing in \u2018bare\u2019 Js?<\/p>\n<p><b>AG:<\/b> \u2013 No, you\u2019re writing as if in Go and connecting to the browser API (the API hasn\u2019t changed). You can write your wrappers so that messages come to the channel \u2013 it's not hard.<\/p>\n<p><b>Q:<\/b> \u2013 What about mobile?<\/p>\n<p><b>AG:<\/b> \u2013 I definitely saw: there are bindings for the Cordova patch that Js runs. As for React Native \u2013 I don't know; there might be, or there might not be (I haven't really looked into it). The N-go game engine supports both mobile applications \u2013 iOS and Android.<\/p>\n<p><b>Q:<\/b> \u2013 A question about Web Assembly. It takes up more and more space, despite compression and being \u2018zipped\u2019... Will we not destroy the world of frontend even further this way?<\/p>\n<p><b>AG:<\/b> \u2013 Web Assembly is a binary format, and a binary by default cannot be larger than text in the final release\u2026 You\u2019re tempted by the runtime, but it\u2019s the same as pulling in the standard Javascript library when it\u2019s not there, which is why we use something like Lodash. I don\u2019t know how much Lodash takes up.<\/p>\n<p><b>Q:<\/b> \u2013 Definitely less than the runtime\u2026<\/p>\n<p><b>AG:<\/b> \u2013 On \u2018pure\u2019 Javascript?<\/p>\n<p><b>Q:<\/b> \u2013 Yes. We compress it before sending\u2026<\/p>\n<p><b>AG:<\/b> \u2013 But this is just text\u2026 In general, a megabyte seems like a lot, but that's it (you have all the runtime). Then you write your business logic which will increase your binary by 1%. So far, I don't see this as a detriment to the frontend. Moreover, Web Assembly will run faster than JavaScript for the obvious reason\u2014it doesn't need to be parsed.<\/p>\n<p><b>Q:<\/b> \u2013 That's still a contentious point\u2026 There isn't a standard implementation of \"Wasm\" (Web Assembly) yet that allows for a definitive judgment. Conceptually, yes: we all understand that the binary should be faster, but the current implementation of V8 is very efficient.<\/p>\n<p><b>AG:<\/b> \u2013 Yes.<\/p>\n<p><b>Q:<\/b> \u2013 The compilation there works really well, and it's not certain there will be a significant advantage.<\/p>\n<p><b>AG:<\/b> \u2013 Big players are also working on Web Assembly.<\/p>\n<p><b>Q:<\/b> \u2013 For now, I think it's still hard to judge Web Assembly. There have been discussions for so many years, but tangible achievements are few.<\/p>\n<p><b>AG:<\/b> \u2013 Perhaps. We'll see.<\/p>\n<p><b>Q:<\/b> \u2013 We have no issues on the backend\u2026 Why not leave those issues to the frontend? Why interfere?<\/p>\n<p><b>AG:<\/b> \u2013 We have to keep a staff of frontend developers.<\/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=\"Play 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>A little advertisement \ud83d\ude42<\/h3>\n<p>\nThank you for staying with us. Do you enjoy our articles? Want to see more interesting content? Support us by placing an order or recommending us to your friends, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloud VPS for developers starting at $4.99<\/a><\/noindex>, <b>a unique entry-level server alternative that we have created for you:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">The whole truth about VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps from $19 or how to properly share a server?<\/a><\/noindex> (options available with RAID1 and RAID10, up to 24 cores and up to 40GB DDR4).<\/p>\n<p><b>Dell R730xd at half the price in the Equinix Tier IV data center in Amsterdam?<\/b> Only with us <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 starting at $199<\/a><\/noindex> in the Netherlands! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 from $99!<\/b><\/b> Read about how <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">To build a corporate-class infrastructure using Dell R730xd E5-2650 v4 servers costing 9000 euros for peanuts?<\/a><\/noindex><br \/>\n<br \/>Source: <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\/en\/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=\"en_US\" \/>\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\/en\/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 May 2018: Host: \u2013 Hello everyone.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/aleksej-grachyov-go-frontend","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/71628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=71628"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/71628\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/71629"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=71628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=71628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=71628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}