{"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\/et\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","title":{"rendered":"Veebiserverite arendamine Golangi abil - lihtsast keeruliseks","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Veebiserverite arendamine Golangi abil - lihtsast keeruliseks\" src=\"\/wp-content\/uploads\/2019\/04\/4ee879ad45f0ed192a15705e20ae00dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nViis aastat tagasi alustasin ma <noindex><a rel=\"nofollow\" href=\"https:\/\/getgophish.com\/\">Gophishi arendamist<\/a><\/noindex>, see andis v\u00f5imaluse \u00f5ppida Golangi. Ma m\u00f5istsin, et Go on v\u00f5imas keel, mille v\u00f5imalusi t\u00e4iendab arvukalt teeke. Go on universaalne: n\u00e4iteks saab seda kasutada serverirakenduste arendamiseks probleemideta.<\/p>\n<p>See artikkel on p\u00fchendatud serveri kirjutamisele Go-s. Alustame lihtsatest asjadest, nagu \u201eTere maailm!\u201c, ja l\u00f5petame rakendusega, millel on j\u00e4rgmised v\u00f5imalused:<\/p>\n<p>\u2014 Let\u2019s Encrypti kasutamine HTTPS-iks.<br \/>\n\u2014 T\u00f6\u00f6tamine API marsruutijana.<br \/>\n\u2014 T\u00f6\u00f6tamine middleware'iga.<br \/>\n\u2014 Staatiliste failide t\u00f6\u00f6tlemine.<br \/>\n\u2014 Korralik v\u00e4ljal\u00fclitamine.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox soovitab:<\/b> Praktiline kursus <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\">\u201ePython-arendaja nullist\u201c<\/a><\/noindex>.<\/p>\n<p><b>Tuletame meelde:<\/b> <i>k\u00f5igile \u00abHabr\u00bb lugejatele \u2013 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi \u00abHabr\u00bb.<\/i>\n<\/p><\/blockquote>\n<h3>Tere, maailm!<\/h3>\n<p>\nVeebiserveri loomine Go-s on v\u00e4ga kiire. Siin on n\u00e4ide toimimisest t\u00f6\u00f6tlusest, mis tagastab eelnevalt mainitud \u201eTere, maailm!\u201c.<\/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, \"Tere maailm!\")\n})\nhttp.ListenAndServe(\":80\", nil)\n}<\/code><\/pre>\n<p>\nP\u00e4rast seda, kui rakendus k\u00e4ivitada ja leht avada <noindex>localhost<\/noindex>, n\u00e4ete kohe teksti \u201eTere, maailm!\u201c (muidugi, kui k\u00f5ik t\u00f6\u00f6tab \u00f5igesti).<\/p>\n<p>Edasi kasutame t\u00f6\u00f6tlust korduvalt, kuid k\u00f5igepealt v\u00f5tame aega m\u00f5istmiseks, kuidas k\u00f5ik toimib.<\/p>\n<h4>net\/http<\/h4>\n<p>\nN\u00e4ites kasutati paketti <noindex><a rel=\"nofollow\" href=\"https:\/\/golang.org\/pkg\/net\/http\/\"><code>net\/http<\/code><\/a><\/noindex>, see on Go p\u00f5hivahend serverite ja HTTP-kliendi arendamiseks. Koodi m\u00f5istmiseks vaatame kolme olulise elemendi t\u00e4hendust: http.Handler, http.ServeMux ja http.Server.<\/p>\n<h4>HTTP-t\u00f6\u00f6tlustooted<\/h4>\n<p>\nKui me saame p\u00e4ringu, anal\u00fc\u00fcsib t\u00f6\u00f6tlus selle ja koostab vastuse. Go-s on t\u00f6\u00f6tlejad rakendatud j\u00e4rgmiselt:<\/p>\n<pre><code class=\"go\">type Handler interface {\n        ServeHTTP(ResponseWriter, *Request)\n}<\/code><\/pre>\n<p>\nEsimeses n\u00e4ites kasutatakse abifunktsiooni http.HandleFunc. See \u00fcmbritseb teist funktsiooni, mis omakorda v\u00f5tab http.ResponseWriter ja http.Request'i ServeHTTP-s.<\/p>\n<p>Teisis\u00f5nu, t\u00f6\u00f6tlejad Golangis esindavad \u00fchtset liidest, mis pakub programmeerijale palju v\u00f5imalusi. N\u00e4iteks on middleware rakendatud l\u00e4bi t\u00f6\u00f6tleja, kus ServeHTTP teeb esmalt midagi ja seej\u00e4rel kutsub teise t\u00f6\u00f6tleja ServeHTTP meetodi.<\/p>\n<p>Nagu eelpool \u00f6eldud, t\u00f6\u00f6tlejad koostavad lihtsalt vastuseid p\u00e4ringutele. Kuid millist t\u00f6\u00f6tlejat tuleks kasutada konkreetsel hetkel?<\/p>\n<h4>P\u00e4ringute marsruutimine<\/h4>\n<p>\n\u00d5ige valiku tegemiseks kasutage HTTP-multiplexerit. M\u00f5nedes raamatukogudes nimetatakse seda muxeriks v\u00f5i ruuteriks, kuid k\u00f5ik need on sama asi. Multiplexer'i funktsioon on anal\u00fc\u00fcsida p\u00e4ringu teed ja valida vastav t\u00f6\u00f6tleja.<\/p>\n<p>Kui on vajalik keerulise marsruutimise tugi, on parem kasutada kolmandate osapoolte raamatukogusid. M\u00f5ned k\u00f5ige arenenumad on: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>, need raamatukogud v\u00f5imaldavad rakendada vahepealseid t\u00f6\u00f6tlemisi ilma eriliste probleemideta. Nende abil on v\u00f5imalik seadistada wildcards-marsruutimist ja lahendada mitmeid muid \u00fclesandeid. Nende eeliseks on \u00fchilduvus standardsete HTTP-t\u00f6\u00f6tlejatega. Tulemuseks on, et saate kirjutada lihtsa koodi, millel on tulevikus muudetava koodi v\u00f5imalus.<\/p>\n<p>T\u00f6\u00f6keeruliste raamistikudega tavaliselt n\u00f5uab ebatavalisi lahendusi, mis oluliselt keerukamaks muudab standardsete t\u00f6\u00f6tlejate kasutamise. Enamikule rakendustele piisab vaikimisi raamatukogu ja lihtsa ruuteri kombinatsioonist.<\/p>\n<h4>P\u00e4ringute t\u00f6\u00f6tlemine<\/h4>\n<p>\nLisaks on meil vajalik komponent, mis \u201ekuulab\u201d sissetulevaid \u00fchendusi ja suunab k\u00f5ik p\u00e4ringud \u00f5igele t\u00f6\u00f6tlejale. Selle \u00fclesandega saab h\u00f5lpsasti hakkama http.Server.<\/p>\n<p>Allpool on n\u00e4idatud, et server vastutab k\u00f5igi \u00fclesannete eest, mis on seotud \u00fchenduste t\u00f6\u00f6tlemisega. See h\u00f5lmab n\u00e4iteks TLS-protokolli t\u00f6\u00f6d. http.ListenAndServe'i kutsumise rakendamiseks kasutatakse standardset HTTP-serverit.<\/p>\n<p>N\u00fc\u00fcd vaatame keerulisemaid n\u00e4iteid.<\/p>\n<h3>Let\u2019s Encrypti lisamine<\/h3>\n<p>\nVaikimisi t\u00f6\u00f6tab meie rakendus HTTP-protokolli abil, kuid soovitatakse kasutada HTTPS-protokolli. Go-s saab seda teha probleemideta. Kui olete saanud sertifikaadi ja privaatv\u00f5tme, piisab, kui m\u00e4\u00e4rata ListenAndServeTLS koos \u00f5ige sertifikaadi ja v\u00f5tmefailiga.<\/p>\n<pre><code class=\"go\">http.ListenAndServeTLS(\":443\", \"cert.pem\", \"key.pem\", nil)<\/code><\/pre>\n<p>\nAlati on v\u00f5imalik paremini teha.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/letsencrypt.org\/\">Let\u2019s Encrypt<\/a><\/noindex> pakub tasuta sertifikaate automaatse uuendamise v\u00f5imalusega. Teenuse kasutamiseks on vajalik pakett <code>autocert<\/code>.<\/p>\n<p>Lihtsaim viis selle seadistamiseks on kasutada meetodit autocert.NewListener koos http.Serve'iga. Meetod v\u00f5imaldab saada ja uuendada TLS-sertifikaate, samal ajal kui HTTP-server t\u00f6\u00f6tleb p\u00e4ringuid:<\/p>\n<pre><code class=\"go\">http.Serve(autocert.NewListener(\"example.com\"), nil)<\/code><\/pre>\n<p>\nKui avame brauseris <noindex><a rel=\"nofollow\" href=\"https:\/\/example.com\">example.com<\/a><\/noindex>, siis saame HTTPS-reaktsiooni \u00abTere, maailm!\u00bb.<\/p>\n<p>Kui vajate p\u00f5hjalikumat seadistamist, siis tasub kasutada autocert.Manager'i. Seej\u00e4rel loome oma http.Server'i instantsi (kuni praeguseni oleme kasutanud vaikeseadet) ja lisame halduri TLSConfig'i serverisse:<\/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>\nSee on lihtne viis kogu HTTPS-toe rakendamiseks automaatse sertifikaadi uuendamisega.<\/p>\n<h3>Mitte-standardsete marsruutide lisamine<\/h3>\n<p>\nVaikimisi marsruuter, mis on kaasatud standardteekidesse, on hea, kuid v\u00e4ga lihtne. Enamikes rakendustes on vajalik keerulisem marsruutimine, sealhulgas pesakonnad ja wildcard-marsruudid v\u00f5i \u0161abloonide ja teeparameetrite seadistamise protseduur.<\/p>\n<p>Selles olukorras tasub kasutada pakette <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gorilla\/mux\">gorilla\/mux<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/go-chi\/chi\">go-chi\/chi<\/a><\/noindex>. Viimasega \u00f5pime me t\u00f6\u00f6tama \u2014 allpool on n\u00e4ide.<\/p>\n<p>Antud on fail api\/v1\/api.go, mis sisaldab meie API marsruute:<\/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>\nSeame marsruutidele api\/vq prefiksi peafailis.<\/p>\n<p>Saame seej\u00e4rel selle meie peamisse marsruuterisse lisada api\/v1\/ prefiksi all tagasi meie p\u00f5hitarvutis:<\/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>\nT\u00f6\u00f6tamine keeruliste marsruutidega Go-s v\u00f5imaldab lihtsustada suure keeruliste rakenduste haldust.<\/p>\n<h3>T\u00f6\u00f6tamine middleware'iga<\/h3>\n<p>\nVahepealse t\u00f6\u00f6tlemise korral kasutatakse \u00fche HTTP-k\u00e4itja m\u00e4hkimist teise, mis v\u00f5imaldab kiiresti teha autentimist, tihendamist, logimist ja m\u00f5ned muud funktsioonid.<\/p>\n<p>N\u00e4iteks vaatame http.Handler'i liidest, mille abil kirjutame kasutajate autentimisega k\u00e4itja.<\/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        \\\/\\\/ Eeldades, et autentimine on l\u00e4bitud, k\u00e4itame originaalk\u00e4itjat\n        next.ServeHTTP(w, r)\n    })\n}<\/code><\/pre>\n<p>\nOn olemas kolmanda osapoole marsruutijad, nagu chi, mis v\u00f5imaldavad vahepealse t\u00f6\u00f6tlemise funktsionaalsust laiendada.<\/p>\n<h3>T\u00f6\u00f6tamine staatiliste failidega<\/h3>\n<p>\nGo standardteek sisaldab v\u00f5imalusi staatilise sisu k\u00e4sitlemiseks, sealhulgas pilte ja JavaScripti ja CSS-faile. Neile p\u00e4\u00e4seb juurde http.FileServer'i funktsiooni kaudu. See tagastab k\u00e4itja, mis edastab faile kindlast kataloogist.<\/p>\n<pre><code class=\"go\">func NewRouter() http.Handler {\n    router := chi.NewRouter()\n    r.Get(\"\/{name}\", HelloName)\n \n\/\/ Kuidas seadistada staatiliste failide jagamist\nstaticPath, _ := filepath.Abs(\"..\/..\/static\/\")\nfs := http.FileServer(http.Dir(staticPath))\n    router.Handle(\"\/*\", fs)\n    \n    return r<\/code><\/pre>\n<p>\nOluline on meeles pidada, et http.Dir kuvab kausta sisu vaid juhul, kui seal pole p\u00f5hifaili index.html. Sellisel juhul tuleks kausta kompromiteerimise v\u00e4ltimiseks kasutada paketti <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jordan-wright\/unindexed\"><code>indeksimata<\/code><\/a><\/noindex>.<\/p>\n<h3>Korralik sulgemine<\/h3>\n<p>\nGo-s on olemas ka selline funktsioon nagu HTTP-serveri korralik sulgemine. Seda saab teha Shutdown() meetodi abil. Server k\u00e4ivitub goroutines ja seej\u00e4rel kuulatakse signaali katkestamiseks. Kui signaal on saadud, l\u00fclitatakse server v\u00e4lja, kuid mitte kohe, vaid m\u00f5ne sekundi p\u00e4rast.<\/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\/\/ Oota katkestust\nc := make(chan os.Signal, 1)\nsignal.Notify(c, os.Interrupt)\n&lt;-c\n \n\/\/ Proovi korralikku sulgemist\nctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\ndefer cancel()\nsrv.Shutdown(ctx)<\/code><\/pre>\n<p><\/p>\n<h3>Kokkuv\u00f5tteks<\/h3>\n<p>\nGo on v\u00f5imas keel, millel on quasi-\u00fcksne standardteek. Selle vaikimisi v\u00f5imalused on ulatuslikud, ja neid saab tugevdada liideste abil \u2014 see v\u00f5imaldab arendada t\u00f5eliselt usaldusv\u00e4\u00e4rseid HTTP-servereid.<\/p>\n<blockquote><p><b>Skillbox soovitab:<\/b><\/p>\n<ul>\n<li>Kaks aastat praktilist kursust <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/\">\u201eMina olen PRO veebiarendaja\u201c<\/a><\/noindex>.<\/li>\n<li>Haridusalane veebikursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/java\/\">\u00abJava-arendaja amet\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktiline aastakursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/\">\u00abPHP-arendaja 0-st PRO-ni\u00bb<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Allikas: <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.1.1 - 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\/et\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Veebiserverite arendamine Golangis \u2014 lihtsast keeruliseks | ProHoster","description":"Viis aastat tagasi alustasin.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/news\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/30782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=30782"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/30782\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/22767"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=30782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=30782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=30782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}