{"id":30782,"date":"2019-10-31T21:37:25","date_gmt":"2019-10-31T18:37:25","guid":{"rendered":"https:\/\/prohoster.info\/blog\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\/"},"modified":"2019-10-31T21:37:25","modified_gmt":"2019-10-31T18:37:25","slug":"razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","title":{"rendered":"De ontwikkeling van webservers in Golang \u2013 van eenvoudig naar complex","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"De ontwikkeling van webservers in Golang \u2013 van eenvoudig naar complex\" src=\"\/wp-content\/uploads\/2019\/04\/4ee879ad45f0ed192a15705e20ae00dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nVijf jaar geleden begon ik <noindex><a rel=\"nofollow\" href=\"https:\/\/getgophish.com\/\">Gophish te ontwikkelen<\/a><\/noindex>, dit gaf me de mogelijkheid om Golang te leren. Ik realiseerde me dat Go een krachtige taal is, waarvan de mogelijkheden worden aangevuld met veel bibliotheken. Go is veelzijdig: je kunt er zonder problemen serverapplicaties mee ontwikkelen.<\/p>\n<p>Dit artikel is gewijd aan het schrijven van een server in Go. Laten we beginnen met eenvoudige dingen, zoals \"Hello world!\", en eindigen met een applicatie met functies zoals:<\/p>\n<p>\u2014 Gebruik van Let\u2019s Encrypt voor HTTPS.<br \/>\n\u2014 Fungeren als API-router.<br \/>\n\u2014 Werken met middleware.<br \/>\n\u2014 Verwerken van statische bestanden.<br \/>\n\u2014 Correct afsluiten.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox raadt aan:<\/b> Praktische cursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/python\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PTNDEV&amp;utm_content=articles&amp;utm_term=gowebserver\">\u00abPython-ontwikkelaar vanaf nul\u00bb<\/a><\/noindex>.<\/p>\n<p><b>Ter herinnering:<\/b> <i>voor alle lezers van \u00abHabr\u00bb \u2014 een korting van 10.000 roebel bij inschrijving voor elke cursus van Skillbox met de promocode \u00abHabr\u00bb.<\/i>\n<\/p><\/blockquote>\n<h3>Hallo, wereld!<\/h3>\n<p>\nEen webserver op Go kan heel snel worden gemaakt. Hier is een voorbeeld van een handler die de eerder beloofde \"Hallo, wereld!\" teruggeeft.<\/p>\n<pre><code class=\"go\">package main\n \nimport (\n\"fmt\"\n\"net\/http\"\n)\n \nfunc main() {\nhttp.HandleFunc(\"\/\", func(w http.ResponseWriter, r *http.Request) {\nfmt.Fprintf(w, \"Hallo Wereld!\")\n})\nhttp.ListenAndServe(\":80\", nil)\n}<\/code><\/pre>\n<p>\nAls je dit vervolgens uitvoert, en de pagina opent <noindex>localhost<\/noindex>, dan zie je meteen de tekst \"Hallo, wereld!\" (natuurlijk, als alles goed werkt).<\/p>\n<p>Daarna zullen we de handler herhaaldelijk gebruiken, maar laten we eerst begrijpen hoe alles in elkaar zit.<\/p>\n<h4>net\/http<\/h4>\n<p>\nIn het voorbeeld werd het pakket gebruikt <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/pkg\/net\/http\/\"><code>net\/http<\/code><\/a><\/noindex>, dit is het belangrijkste hulpmiddel in Go voor zowel server- als HTTP-clientontwikkeling. Om de code te begrijpen, laten we de betekenis van drie belangrijke elementen bekijken: http.Handler, http.ServeMux en http.Server.<\/p>\n<h4>HTTP-handlers<\/h4>\n<p>\nWanneer we een verzoek ontvangen, analyseert de handler het en vormt een antwoord. Handlers in Go zijn als volgt ge\u00efmplementeerd:<\/p>\n<pre><code class=\"go\">type Handler interface {\n        ServeHTTP(ResponseWriter, *Request)\n}<\/code><\/pre>\n<p>\nIn het eerste voorbeeld wordt de hulpfunctie http.HandleFunc gebruikt. Deze wikkelt een andere functie in, die op haar beurt http.ResponseWriter en http.Request in ServeHTTP accepteert.<\/p>\n<p>Met andere woorden, handlers in Golang worden gepresenteerd als een enkele interface, wat de programmeur veel mogelijkheden biedt. Zo is middleware bijvoorbeeld ge\u00efmplementeerd met behulp van een handler, waar ServeHTTP eerst iets doet en dan de ServeHTTP-methode van een andere handler aanroept.<\/p>\n<p>Zoals eerder aangegeven, vormen de handlers gewoon de antwoorden op verzoeken. Maar welke handler moet je op een bepaald moment gebruiken?<\/p>\n<h4>Routing van verzoeken<\/h4>\n<p>\nOm de juiste keuze te maken, gebruik je een HTTP-multiplexer. In sommige bibliotheken wordt dit een muxer of router genoemd, maar het is allemaal hetzelfde. De functie van de multiplexer is het analyseren van het pad van het verzoek en het kiezen van de bijbehorende handler.<\/p>\n<p>Als er complexe routingondersteuning nodig is, kun je beter externe bibliotheken gebruiken. Enkele van de meest geavanceerde zijn <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>, deze bibliotheken maken het mogelijk om middleware eenvoudig te implementeren. Hiermee kun je wildcard-routing instellen en een aantal andere taken uitvoeren. Hun voordeel is de compatibiliteit met standaard HTTP-handlers. Hierdoor kun je eenvoudige code schrijven met de mogelijkheid om deze in de toekomst te wijzigen.<\/p>\n<p>Werken met complexe frameworks vereist in de regel niet-standaard oplossingen, wat het gebruik van de standaard handlers aanzienlijk bemoeilijkt. Voor het merendeel van de applicaties is een combinatie van de standaardbibliotheek en een eenvoudige router voldoende.<\/p>\n<h4>Verwerkingsverzoeken<\/h4>\n<p>\nBovendien hebben we een component nodig die 'luistert' naar binnenkomende verbindingen en alle verzoeken naar de juiste handler doorverbindt. Deze taak kan probleemloos door http.Server worden uitgevoerd.<\/p>\n<p>Hieronder is te zien dat de server verantwoordelijk is voor alle taken die verband houden met het verwerken van verbindingen. Dit omvat bijvoorbeeld het werken met het TLS-protocol. Voor de implementatie wordt de standaard HTTP-server gebruikt via http.ListenAndServer.<\/p>\n<p>Laten we nu naar meer complexe voorbeelden kijken.<\/p>\n<h3>Toevoegen van Let\u2019s Encrypt<\/h3>\n<p>\nStandaard werkt onze applicatie via het HTTP-protocol, maar het wordt aanbevolen om het HTTPS-protocol te gebruiken. In Go is dit geen probleem. Als je een certificaat en een priv\u00e9sleutel hebt ontvangen, hoef je alleen maar ListenAndServeTLS aan te roepen met de juiste certificaat- en sleutelbestanden.<\/p>\n<pre><code class=\"go\">http.ListenAndServeTLS(\":443\", \"cert.pem\", \"key.pem\", nil)<\/code><\/pre>\n<p>\nHet kan altijd beter.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/letsencrypt.org\/\">Let\u2019s Encrypt<\/a><\/noindex> biedt gratis certificaten met de mogelijkheid voor automatische vernieuwing. Om gebruik te maken van de service, is het pakket nodig <code>autocert<\/code>.<\/p>\n<p>De eenvoudigste manier om het in te stellen is door de autocert.NewListener-methode te gebruiken in combinatie met http.Serve. Deze methode maakt het mogelijk om TLS-certificaten te verkrijgen en te vernieuwen terwijl de HTTP-server verzoeken verwerkt:<\/p>\n<pre><code class=\"go\">http.Serve(autocert.NewListener(\"example.com\"), nil)<\/code><\/pre>\n<p>\nAls we het in de browser openen <noindex><a rel=\"nofollow\" href=\"https:\/\/example.com\">example.com<\/a><\/noindex>, krijgen we een HTTPS-antwoord \"Hello, world!\".<\/p>\n<p>Als een meer gedetailleerde configuratie nodig is, kan de autocert.Manager worden gebruikt. Vervolgens cre\u00ebren we een eigen instantie van http.Server (tot nu toe hebben we de standaardversie gebruikt) en voegen de manager toe aan de server TLSConfig:<\/p>\n<pre><code class=\"go\">m := &amp;autocert.Manager{\nCache:      autocert.DirCache(\"golang-autocert\"),\nPrompt:     autocert.AcceptTOS,\nHostPolicy: autocert.HostWhitelist(\"example.org\", \"www.example.org\"),\n}\nserver := &amp;http.Server{\n    Addr:      \":443\",\n    TLSConfig: m.TLSConfig(),\n}\nserver.ListenAndServeTLS(\"\", \"\")<\/code><\/pre>\n<p>\nDit is een eenvoudige manier om volledige ondersteuning voor HTTPS met automatische certificaatvernieuwing te implementeren.<\/p>\n<h3>Toevoegen van aangepaste routes<\/h3>\n<p>\nDe standaardrouter die in de standaardbibliotheek is opgenomen, is goed, maar erg eenvoudig. In de meeste applicaties is geavanceerdere routering nodig, inclusief geneste en wildcard-routes of het instellen van sjablonen en padparameters.<\/p>\n<p>In dat geval is het verstandig om pakketten te gebruiken <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>. Met de laatste leren we werken \u2014 hieronder staat een voorbeeld.<\/p>\n<p>Gegeven: het bestand api\/v1\/api.go, dat routes voor onze API bevat:<\/p>\n<pre><code class=\"go\">\/ HelloResponse is the JSON representation for a customized message\ntype HelloResponse struct {\nMessage string `json:\"message\"`\n}\n \n\/\/ HelloName returns a personalized JSON message\nfunc HelloName(w http.ResponseWriter, r *http.Request) {\nname := chi.URLParam(r, \"name\")\nresponse := HelloResponse{\nMessage: fmt.Sprintf(\"Hello %s!\", name),\n}\njsonResponse(w, response, http.StatusOK)\n}\n \n\/\/ NewRouter returns an HTTP handler that implements the routes for the API\nfunc NewRouter() http.Handler {\nr := chi.NewRouter()\nr.Get(\"\/{name}\", HelloName)\nreturn r\n}<\/code><\/pre>\n<p>\nWe stellen een voorvoegsel api\/vq in voor de routes in het hoofdbestand.<\/p>\n<p>We kunnen dit dan onder de api\/v1\/ voorprefix in onze hoofdapplicatie koppelen:<\/p>\n<pre><code class=\"go\">\/\/ NewRouter returns a new HTTP handler that implements the main server routes\nfunc NewRouter() http.Handler {\nrouter := chi.NewRouter()\n    router.Mount(\"\/api\/v1\/\", v1.NewRouter())\n    return router\n}\nhttp.Serve(autocert.NewListener(\"example.com\"), NewRouter())<\/code><\/pre>\n<p>\nDe eenvoud van werken met complexe routes in Go maakt het mogelijk om de structurering van grote complexe applicaties te vereenvoudigen.<\/p>\n<h3>Werken met middleware<\/h3>\n<p>\nBij tussenverwerking wordt \u00e9\u00e9n HTTP-handler door een andere gewikkeld, waardoor het mogelijk is om snel authenticatie, compressie, logging en andere functies uit te voeren.<\/p>\n<p>Als voorbeeld bekijken we de http.Handler-interface en schrijven we een handler voor gebruikersauthenticatie.<\/p>\n<pre><code class=\"go\">func RequireAuthentication(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        if !isAuthenticated(r) {\n            http.Redirect(w, r, \"\/login\", http.StatusTemporaryRedirect)\n            return\n        }\n        \/\/ Aangenomen dat authentificatie is geslaagd, voer de originele handler uit\n        next.ServeHTTP(w, r)\n    })\n}<\/code><\/pre>\n<p>\nEr zijn externe routers, zoals chi, die de functionaliteit van middleware kunnen uitbreiden.<\/p>\n<h3>Werken met statische bestanden<\/h3>\n<p>\nDe standaardbibliotheek van Go bevat mogelijkheden voor het werken met statische inhoud, inclusief afbeeldingen, evenals JavaScript- en CSS-bestanden. Toegang tot deze bestanden kan worden verkregen via de functie http.FileServer. Deze retourneert een handler die bestanden uit een bepaalde directory serveert.<\/p>\n<pre><code class=\"go\">func NewRouter() http.Handler {\n    router := chi.NewRouter()\n    r.Get(\"\/{name}\", HelloName)\n \n\/\/ Configuratie voor het serveren van statische bestanden\nstaticPath, _ := filepath.Abs(\"..\/..\/static\/\")\nfs := http.FileServer(http.Dir(staticPath))\n    router.Handle(\"\/*\", fs)\n    \n    return r<\/code><\/pre>\n<p>\nHet is belangrijk om te onthouden dat http.Dir de inhoud van de directory alleen weergeeft als er geen hoofdindexbestand index.html in de map aanwezig is. In dit geval, om te voorkomen dat de directory gecompromitteerd wordt, moet het pakket worden gebruikt. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jordan-wright\/unindexed\"><code>niet-ge\u00efncludeerd<\/code><\/a><\/noindex>.<\/p>\n<h3>Correcte afsluiting<\/h3>\n<p>\nIn Go is er ook een functie voor correcte afsluiting van de HTTP-server. Dit kan gedaan worden met de Shutdown()-methode. De server wordt gestart in een goroutine en vervolgens wordt een kanaal afgeluisterd om een onderbrekingssignaal te ontvangen. Zodra het signaal wordt ontvangen, schakelt de server niet onmiddellijk uit, maar na een paar seconden.<\/p>\n<pre><code class=\"go\">handler := server.NewRouter()\nsrv := &amp;http.Server{\n    Handler: handler,\n}\n \ngo func() {\nsrv.Serve(autocert.NewListener(domains...))\n}()\n \n\/\/ Wacht op een onderbreking\nc := make(chan os.Signal, 1)\nsignal.Notify(c, os.Interrupt)\n&lt;-c\n \n\/\/ Probeer een nette afsluiting\nctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\ndefer cancel()\nsrv.Shutdown(ctx)<\/code><\/pre>\n<p><\/p>\n<h3>Tot slot<\/h3>\n<p>\nGo is een krachtige taal met een bijna universele standaardbibliotheek. De standaardfunctionaliteit is behoorlijk breed en kan worden versterkt door interfaces - dit maakt het mogelijk om echt betrouwbare HTTP-servers te ontwikkelen.<\/p>\n<blockquote><p><b>Skillbox raadt aan:<\/b><\/p>\n<ul>\n<li>Praktische tweejarenopleiding <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/\">\u2018Ik ben een PRO webdeveloper\u2019<\/a><\/noindex>.<\/li>\n<li>Online opleidingscursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/java\/\">\u2018Beroep Java-developer\u2019<\/a><\/noindex>.<\/li>\n<li>Praktische jaaropleiding <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/\">\u2018PHP-developer van 0 tot PRO\u2019<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/446454\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c Gophish, \u044d\u0442\u043e \u0434\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u0443\u0447\u0438\u0442\u044c Golang. \u042f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e Go \u2014 \u043c\u043e\u0449\u043d\u044b\u0439 \u044f\u0437\u044b\u043a, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. Go \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u0435\u043d: \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 Go. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0432\u0440\u043e\u0434\u0435 \u00abHello world!\u00bb, \u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22767,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-30782","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b.\" \/>\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\/nl\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043d\u0430 Golang \u2014 \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\" \/>\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=\"2019-10-31T18:37:25+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:37:25+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\udd47Webservers ontwikkelen in Golang - van eenvoudig naar complex | ProHoster","description":"Vijf jaar geleden ben ik begonnen.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043d\u0430 Golang \u2014 \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443 | ProHoster","og:description":"\u041f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b.","og:url":"https:\/\/prohoster.info\/nl\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","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":"2019-10-31T18:37:25+00:00","article:modified_time":"2019-10-31T18:37:25+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30782","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":"2026-01-21 02:59:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:29:56","updated":"2026-01-21 02:59:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/30782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=30782"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/30782\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/22767"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=30782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=30782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=30782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}