{"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\/sv\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","title":{"rendered":"Utveckling av webbservrar i Golang \u2013 fr\u00e5n enkelt till komplext","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Utveckling av webbservrar i Golang \u2013 fr\u00e5n enkelt till komplext\" src=\"\/wp-content\/uploads\/2019\/04\/4ee879ad45f0ed192a15705e20ae00dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nF\u00f6r fem \u00e5r sedan b\u00f6rjade jag <noindex><a rel=\"nofollow\" href=\"https:\/\/getgophish.com\/\">utveckla Gophish<\/a><\/noindex>, vilket gav mig m\u00f6jlighet att l\u00e4ra mig Golang. Jag ins\u00e5g att Go \u00e4r ett kraftfullt spr\u00e5k vars m\u00f6jligheter kompletteras av m\u00e5nga bibliotek. Go \u00e4r m\u00e5ngsidigt: framf\u00f6r allt kan man utan problem utveckla serverapplikationer med det.<\/p>\n<p>Denna artikel handlar om att skriva en server i Go. Vi b\u00f6rjar med enkla saker, som \"Hello world!\", och avslutar med en applikation med f\u00f6ljande funktioner:<\/p>\n<p>\u2014 Anv\u00e4ndning av Let's Encrypt f\u00f6r HTTPS.<br \/>\n\u2014 Arbetar som en API-ruttare.<br \/>\n\u2014 Arbetar med middleware.<br \/>\n\u2014 Hantering av statiska filer.<br \/>\n\u2014 Korrekt avslutande av arbetet.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox rekommenderar:<\/b> Praktisk kurs <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-utvecklare fr\u00e5n grunden\u00bb<\/a><\/noindex>.<\/p>\n<p><b>P\u00e5minnelse:<\/b> <i>f\u00f6r alla l\u00e4sare av \"Habr\" \u2014 10 000 rubel rabatt vid registrering f\u00f6r vilken kurs som helst p\u00e5 Skillbox med rabattkoden \"Habr\".<\/i>\n<\/p><\/blockquote>\n<h3>Hej, v\u00e4rlden!<\/h3>\n<p>\nAtt skapa en webbserver i Go g\u00e5r mycket snabbt. H\u00e4r \u00e4r ett exempel p\u00e5 en hanterare som returnerar den ovan n\u00e4mnda \"Hello, world!\".<\/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, \"Hello World!\")\n})\nhttp.ListenAndServe(\":80\", nil)\n}<\/code><\/pre>\n<p>\nEfter detta, om du startar applikationen och \u00f6ppnar sidan <noindex>localhost<\/noindex>, kommer du omedelbart att se texten \"Hello, world!\" (naturligtvis om allt fungerar som det ska).<\/p>\n<p>D\u00e4refter kommer vi att anv\u00e4nda hanteraren flera g\u00e5nger, men f\u00f6rst l\u00e5t oss f\u00f6rst\u00e5 hur allt fungerar.<\/p>\n<h4>net\/http<\/h4>\n<p>\nI exemplet anv\u00e4ndes paketet <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/pkg\/net\/http\/\"><code>net\/http<\/code><\/a><\/noindex>, det \u00e4r huvudsakligt verktyg i Go f\u00f6r att utveckla b\u00e5de servrar och HTTP-klienter. F\u00f6r att f\u00f6rst\u00e5 koden, l\u00e5t oss g\u00e5 igenom betydelsen av tre viktiga element: http.Handler, http.ServeMux och http.Server.<\/p>\n<h4>HTTP-hanterare<\/h4>\n<p>\nN\u00e4r vi f\u00e5r en beg\u00e4ran analyserar hanteraren den och formar ett svar. Hanterarna i Go implementeras p\u00e5 f\u00f6ljande s\u00e4tt:<\/p>\n<pre><code class=\"go\">type Handler interface {\n        ServeHTTP(ResponseWriter, *Request)\n}<\/code><\/pre>\n<p>\nI det f\u00f6rsta exemplet anv\u00e4nds hj\u00e4lpfunktionen http.HandleFunc. Den omsluter en annan funktion som i sin tur tar http.ResponseWriter och http.Request i ServeHTTP.<\/p>\n<p>Med andra ord, hanterarna i Golang representeras av ett enda gr\u00e4nssnitt, vilket ger m\u00e5nga m\u00f6jligheter f\u00f6r programmeraren. Till exempel, middleware implementeras med hj\u00e4lp av en hanterare, d\u00e4r ServeHTTP f\u00f6rst g\u00f6r n\u00e5got och sedan anropar ServeHTTP-metoden f\u00f6r en annan hanterare.<\/p>\n<p>Som tidigare n\u00e4mnts formar hanterarna helt enkelt svar p\u00e5 beg\u00e4rningar. Men vilken specifik hanterare ska man anv\u00e4nda vid ett givet tillf\u00e4lle?<\/p>\n<h4>Ruttning av beg\u00e4rningar<\/h4>\n<p>\nF\u00f6r att g\u00f6ra ett korrekt val, anv\u00e4nd HTTP-multiplexern. I flera bibliotek kallas den muxer eller router, men allt detta \u00e4r samma sak. Multiplexerns funktion \u00e4r att analysera s\u00f6kv\u00e4gen f\u00f6r f\u00f6rfr\u00e5gan och v\u00e4lja motsvarande hanterare.<\/p>\n<p>Om du beh\u00f6ver st\u00f6d f\u00f6r mer komplexa ruttningar, \u00e4r det b\u00e4ttre att anv\u00e4nda externa bibliotek. N\u00e5gra av de mest avancerade \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>, dessa bibliotek m\u00f6jligg\u00f6r mellanliggande bearbetning utan st\u00f6rre problem. Med deras hj\u00e4lp kan du konfigurera wildcard-routing och utf\u00f6ra en rad andra uppgifter. Deras f\u00f6rdel \u00e4r kompatibilitet med standard HTTP-hanterare. Som ett resultat kan du skriva enkel kod med m\u00f6jlighet till framtida modifieringar.<\/p>\n<p>Arbete med komplexa ramverk i vanliga situationer kr\u00e4ver inte helt standardl\u00f6sningar, vilket v\u00e4sentligt komplicerar anv\u00e4ndningen av standardhanterare. F\u00f6r att skapa majoriteten av applikationerna r\u00e4cker det med en kombination av det standardbiblioteket och en enkel router.<\/p>\n<h4>Beg\u00e4rningshantering<\/h4>\n<p>\nDessutom beh\u00f6ver vi en komponent som 'lyssnar' p\u00e5 inkommande anslutningar och dirigerar alla f\u00f6rfr\u00e5gningar till r\u00e4tt hanterare. Denna uppgift klarar http.Server utan problem.<\/p>\n<p>Nedan visas att servern ansvarar f\u00f6r alla uppgifter relaterade till behandlingen av anslutningar. Det handlar till exempel om arbete enligt TLS-protokollet. F\u00f6r att implementera anropet http.ListenAndServer anv\u00e4nds standard HTTP-servern.<\/p>\n<p>Nu ska vi titta p\u00e5 mer komplexa exempel.<\/p>\n<h3>Till\u00e4gg av Let\u2019s Encrypt<\/h3>\n<p>\nSom standard fungerar v\u00e5r applikation via HTTP-protokollet, men det rekommenderas att anv\u00e4nda HTTPS-protokollet. I Go g\u00e5r detta utan problem. Om du har f\u00e5tt ett certifikat och en privat nyckel, r\u00e4cker det med att ange ListenAndServeTLS med r\u00e4tt filer f\u00f6r certifikatet och nyckeln.<\/p>\n<pre><code class=\"go\">http.ListenAndServeTLS(\":443\", \"cert.pem\", \"key.pem\", nil)<\/code><\/pre>\n<p>\nDet g\u00e5r alltid att g\u00f6ra det b\u00e4ttre.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/letsencrypt.org\/\">Let's Encrypt<\/a><\/noindex> erbjuder gratis certifikat med m\u00f6jlighet till automatisk f\u00f6rnyelse. F\u00f6r att anv\u00e4nda tj\u00e4nsten beh\u00f6vs paketet <code>autocert<\/code>.<\/p>\n<p>Det enklaste s\u00e4ttet att konfigurera det \u00e4r att anv\u00e4nda metoden autocert.NewListener i kombination med http.Serve. Metoden g\u00f6r det m\u00f6jligt att f\u00e5 och f\u00f6rnya TLS-certifikat, medan HTTP-servern hanterar f\u00f6rfr\u00e5gningarna:<\/p>\n<pre><code class=\"go\">http.Serve(autocert.NewListener(\"example.com\"), nil)<\/code><\/pre>\n<p>\nOm vi \u00f6ppnar i webbl\u00e4saren <noindex><a rel=\"nofollow\" href=\"https:\/\/example.com\">example.com<\/a><\/noindex>, f\u00e5r vi HTTPS-svar \"Hello, world!\".<\/p>\n<p>Om du beh\u00f6ver en mer noggrann konfiguration, b\u00f6r du anv\u00e4nda autocert.Manager. Skapa sedan din egen instans av http.Server (hittills har vi anv\u00e4nt standardinstansen) och l\u00e4gg till managern i serverns 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>\nDetta \u00e4r ett enkelt s\u00e4tt att implementera fullst\u00e4ndigt st\u00f6d f\u00f6r HTTPS med automatisk certifikatf\u00f6rnyelse.<\/p>\n<h3>L\u00e4gga till icke-standardrutter<\/h3>\n<p>\nDen standardrouter som ing\u00e5r i standardbiblioteket \u00e4r bra, men den \u00e4r mycket enkel. De flesta applikationer beh\u00f6ver en mer komplicerad routing, inklusive inb\u00e4ddade och wildcard-rutter eller en process f\u00f6r att st\u00e4lla in mallar och v\u00e4gparameterar.<\/p>\n<p>I det h\u00e4r fallet b\u00f6r vi anv\u00e4nda paketen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>. Vi kommer att l\u00e4ra oss att arbeta med det \u2014 en exempel visas nedan.<\/p>\n<p>Givet \u2014 filen api\/v1\/api.go, som inneh\u00e5ller rutter f\u00f6r v\u00e5rt API:<\/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>\nVi s\u00e4tter en prefix f\u00f6r rutter api\/vq i huvudfilen.<\/p>\n<p>Vi kan sedan montera detta p\u00e5 v\u00e5r huvudrouter under prefixet api\/v1 i v\u00e5r huvudapplikation:<\/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>\nEnkelheten i att arbeta med komplexa rutter i Go g\u00f6r det m\u00f6jligt att f\u00f6renkla strukturen f\u00f6r att hantera stora och komplexa applikationer.<\/p>\n<h3>Arbeta med mellanprogram<\/h3>\n<p>\nVid anv\u00e4ndning av mellanprogram omger man en HTTP-behandlare med en annan, vilket m\u00f6jligg\u00f6r snabb autentisering, komprimering, loggning och n\u00e5gra andra funktioner.<\/p>\n<p>Som exempel, l\u00e5t oss titta p\u00e5 gr\u00e4nssnittet http.Handler, med hj\u00e4lp av detta skriver vi en behandlare med autentisering f\u00f6r anv\u00e4ndare av tj\u00e4nsten.<\/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        \/\/ Om autentiseringen lyckades, k\u00f6r den ursprungliga behandlaren\n        next.ServeHTTP(w, r)\n    })\n}<\/code><\/pre>\n<p>\nDet finns externa routrar som chi, som m\u00f6jligg\u00f6r ut\u00f6kning av funktionaliteten f\u00f6r mellanprogram.<\/p>\n<h3>Arbeta med statiska filer<\/h3>\n<p>\nStandardbiblioteket i Go inkluderar funktioner f\u00f6r att hantera statiskt inneh\u00e5ll, inklusive bilder, samt JavaScript- och CSS-filer. \u00c5tkomst till dem kan g\u00f6ras via funktionen http.FileServer. Den returnerar en behandlare som serverar filer fr\u00e5n en specifik katalog.<\/p>\n<pre><code class=\"go\">func NewRouter() http.Handler {\n    router := chi.NewRouter()\n    r.Get(\"\/{name}\", HelloName)\n \n\/\/ Konfigurera distribution av statiska filer\nstaticPath, _ := filepath.Abs(\"..\/..\/\/static\/\")\nfs := http.FileServer(http.Dir(staticPath))\n    router.Handle(\"\/*\", fs)\n    \n    return r<\/code><\/pre>\n<p>\nDet \u00e4r viktigt att komma ih\u00e5g att http.Dir visar inneh\u00e5llet i katalogen om det inte finns n\u00e5gon huvudfil index.html i den. I detta fall, f\u00f6r att undvika katalogkompromiss, b\u00f6r paketet anv\u00e4ndas <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jordan-wright\/unindexed\"><code>oberoende<\/code><\/a><\/noindex>.<\/p>\n<h3>Korrekt avst\u00e4ngning<\/h3>\n<p>\nI Go finns det ocks\u00e5 en funktion f\u00f6r korrekt avst\u00e4ngning av HTTP-servern. Detta kan g\u00f6ras med hj\u00e4lp av metoden Shutdown(). Servern startas i en goroutine, och sedan lyssnas p\u00e5 kanalen f\u00f6r att ta emot avbrottssignaler. S\u00e5 snart signalen tas emot st\u00e4ngs servern ner, men inte omedelbart, utan efter n\u00e5gra sekunder.<\/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\/\/ V\u00e4nta p\u00e5 ett avbrott\nc := make(chan os.Signal, 1)\nsignal.Notify(c, os.Interrupt)\n&lt;-c\n \n\/\/ F\u00f6rs\u00f6k en smidig avst\u00e4ngning\nctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\ndefer cancel()\nsrv.Shutdown(ctx)<\/code><\/pre>\n<p><\/p>\n<h3>Som en avslutning<\/h3>\n<p>\nGo \u00e4r ett kraftfullt spr\u00e5k med en praktiskt taget universell standardbibliotek. Dess standardfunktioner \u00e4r ganska omfattande, och de kan f\u00f6rst\u00e4rkas med hj\u00e4lp av gr\u00e4nssnitt \u2014 detta m\u00f6jligg\u00f6r utveckling av verkligt tillf\u00f6rlitliga HTTP-servrar.<\/p>\n<blockquote><p><b>Skillbox rekommenderar:<\/b><\/p>\n<ul>\n<li>Tv\u00e5\u00e5rig praktisk kurs <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/\">\u00abJag \u00e4r webbutvecklare PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Utbildningskurs online <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/java\/\">\"Yrket Java-utvecklare\"<\/a><\/noindex>.<\/li>\n<li>Praktisk \u00e5rskurs <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/\">PHP-utvecklare fr\u00e5n grunden till PRO<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Utveckling av webbservrar p\u00e5 Golang \u2014 fr\u00e5n enkelt till avancerat | ProHoster","description":"F\u00f6r fem \u00e5r sedan b\u00f6rjade jag.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/30782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=30782"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/30782\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/22767"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=30782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=30782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=30782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}