{"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\/novosti-interneta\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu","title":{"rendered":"Veebiserverite arendamine Golangis \u2014 lihtsast keeruliseni","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Veebiserverite arendamine Golangis \u2014 lihtsast keeruliseni\" src=\"\/wp-content\/uploads\/2019\/04\/4ee879ad45f0ed192a15705e20ae00dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nViis aastat tagasi alustasin <noindex><a rel=\"nofollow\" href=\"https:\/\/getgophish.com\/\">Gophishi arendamist<\/a><\/noindex>, see andis v\u00f5imaluse Golangi \u00f5ppimiseks. M\u00f5istsin, et Go on v\u00f5imas keel, mille v\u00f5imalusi t\u00e4iendavad mitmed teegid. Go on universaalne: selle abil on lihtne arendada serverirakendusi.<\/p>\n<p>See artikkel on p\u00fchendatud Go-s serveri kirjutamisele. Alustame lihtsatest asjadest, nagu \"Tere maailm!\", ja l\u00f5petame rakendusega, millel on j\u00e4rgmised v\u00f5imalused:<\/p>\n<p>\u2014 Let\u2019s Encrypti kasutamine HTTPS-i jaoks.<br \/>\n\u2014 T\u00f6\u00f6 API marsruutijana.<br \/>\n\u2014 T\u00f6\u00f6 middleware\u2019iga.<br \/>\n\u2014 Statiliste failide t\u00f6\u00f6tlemine.<br \/>\n\u2014 Korralik l\u00f5petamine.<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 algusest peale\u201c<\/a><\/noindex>.<\/p>\n<p><b>Tuletame meelde:<\/b> <i>k\u00f5igile \u00abHabra\u00bb lugejatele \u2014 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi \u00abHabr\u00bb abil.<\/i>\n<\/p><\/blockquote>\n<h3>Tere, maailm!<\/h3>\n<p>\nVeebiserveri loomine Go-s on v\u00e4ga kiire. Siin on n\u00e4ide t\u00f6\u00f6tlejast, mis naaseb lubatud \"Tere, maailm!\".<\/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 lehte avada <noindex>localhost<\/noindex>, n\u00e4ete kohe teksti \"Tere, maailm!\" (loomulikult, kui k\u00f5ik t\u00f6\u00f6tab \u00f5igesti).<\/p>\n<p>Edasi kavatseme t\u00f6\u00f6tlejat mitu korda kasutada, kuid esmalt m\u00f5istame, kuidas k\u00f5ik on \u00fcles seatud.<\/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>, mis on Go-s peamine vahend serverite ja HTTP-kliendi arendamiseks. Koodi parema m\u00f5istmise nimel tutvume kolme olulise elemendi t\u00e4hendusega: http.Handler, http.ServeMux ja http.Server.<\/p>\n<h4>HTTP t\u00f6\u00f6tlejad<\/h4>\n<p>\nKui saame p\u00e4ringu, anal\u00fc\u00fcsib t\u00f6\u00f6tleja selle ja vormib 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 teise funktsiooni, mis omakorda v\u00f5tab vastu http.ResponseWriter ja http.Request funktsioonis ServeHTTP.<\/p>\n<p>Teisiti \u00f6eldes, on t\u00f6\u00f6tlejad Golangis esitatud \u00fchtse liidesena, mis annab programmeerijale palju v\u00f5imalusi. N\u00e4iteks rakendatakse middleware t\u00f6\u00f6tleja kaudu, kus ServeHTTP teeb k\u00f5igepealt midagi ja seej\u00e4rel kutsub teise t\u00f6\u00f6tleja ServeHTTP meetodi.<\/p>\n<p>Nagu juba mainitud, kujundavad t\u00f6\u00f6tlejad lihtsalt vastuseid p\u00e4ringutele. Kuid millist t\u00f6\u00f6tlejat on konkreetsel hetkel vaja kasutada?<\/p>\n<h4>P\u00e4ringute marsruutimine<\/h4>\n<p>\n\u00d5ige valiku tegemiseks kasutage HTTP-multiplexerit. Mitmes raamatukogus nimetatakse seda muxeriks v\u00f5i ruuteriks, kuid t\u00f5epoolest on need k\u00f5ik \u00fchesugused. Multiplexer'i funktsioon on anal\u00fc\u00fcsida p\u00e4ringu teed ja valida vastav t\u00f6\u00f6tleja.<\/p>\n<p>Kui on vajalik keeruka marsruutimise tugi, siis on parem kasutada kolmandate osapoolte raamatukogusid. \u00dcks k\u00f5ige arenenumatest 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 h\u00f5lpsasti rakendada vahepealse t\u00f6\u00f6tlemise lahendusi. Nende abil saate seadistada wildcard-marsruutimise ja teisi \u00fclesandeid. Nende eeliseks on \u00fchilduvus standardsete HTTP-t\u00f6\u00f6tlejatega. Tulemusena saate kirjutada lihtsa koodi, millel on v\u00f5imalus seda tulevikus kohandada.<\/p>\n<p>T\u00f6\u00f6tamine keerukate raamistikudega tavap\u00e4rases olukorras n\u00f5uab mitte v\u00e4ga standardseid lahendusi, mis oluliselt raskendab vaikimisi t\u00f6\u00f6tlejate kasutamist. Enamik rakendusi saavad hakkama vaikimisi raamatukogu ja lihtsa ruuteriga.<\/p>\n<h4>P\u00e4ringute t\u00f6\u00f6tlemine<\/h4>\n<p>\nLisaks vajame komponenti, mis \"kuulab\" sisse tulevaid \u00fchendusi ja suunab k\u00f5ik p\u00e4ringud \u00f5ige t\u00f6\u00f6tleja juurde. Selle \u00fclesande t\u00e4idab probleemideta http.Server.<\/p>\n<p>Allpool on n\u00e4idatud, et server vastutab k\u00f5igi \u00fclesannete eest, mis on seotud \u00fchenduste t\u00f6\u00f6tlemisega. N\u00e4iteks toimub siin TLS-protokolli t\u00f6\u00f6tlemine. http.ListenAndServeri rakendamiseks kasutatakse standardset HTTP-serverit.<\/p>\n<p>N\u00fc\u00fcd vaatame keerulisemaid n\u00e4iteid.<\/p>\n<h3>Lisamine Let\u2019s Encrypt<\/h3>\n<p>\nVaikimisi t\u00f6\u00f6tab meie rakendus HTTP-protokolli kaudu, kuid on soovitatav kasutada HTTPS-protokolli. Go-s on see lihtne. Kui olete saanud sertifikaadi ja privaatv\u00f5tme, piisab, kui kutsuda esile ListenAndServeTLS, osutades \u00f5igele sertifikaadi ja v\u00f5tme failile.<\/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 autocert.NewListener meetodit koos http.Serve'iga. See meetod v\u00f5imaldab hankida ja uuendada TLS-sertifikaate, samal ajal kui HTTP-server k\u00e4sitleb 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>, saame HTTPS-vastuse \u201eHello, world!\u201d.<\/p>\n<p>Kui vajame t\u00e4iendavat seadistamist, on soovitatav kasutada autocert.Manager haldurit. Seej\u00e4rel loome oma http.Server eksemplari (kuni siiamaani kasutasime vaikeversiooni) ja lisame halduri serveri TLSConfig'i:<\/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 t\u00e4ieliku HTTPS toe rakendamiseks koos automaatse sertifikaadi uuendamisega.<\/p>\n<h3>Kohandatud marsruutide lisamine<\/h3>\n<p>\nStandardteekide vaikemarsruuter, mis on kaasatud standardbiblioteeki, on hea, kuid v\u00e4ga lihtne. Enamikus rakendustes on vaja keerukamat marsruutimist, sealhulgas pesamarsruute ja wildcard-marsruute v\u00f5i samuti mallide ja marsruutide parameetrite m\u00e4\u00e4ramist.<\/p>\n<p>Selles olukorras on soovitatav 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>Meie viimane teema on see, kuidas t\u00f6\u00f6tada . Allpool on n\u00e4ide.<\/p>\n<p>Antud on fail api\/v1\/api.go, mis sisaldab marsruute meie API-le:<\/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>\nSeadistame marsruutide eelprefiksiks api\/vq peafailis.<\/p>\n<p>Saame selle mountida meie peamise marsruudile api\/v1\/ prefiksi alla tagasi meie p\u00f5hi\u00e4pis:<\/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>\nGo-s keeruliste marsruutidega t\u00f6\u00f6tamise lihtsus v\u00f5imaldab lihtsustada suuremate keeruliste rakenduste haldamist.<\/p>\n<h3>T\u00f6\u00f6tamine vahekihiga<\/h3>\n<p>\nVahekihtide t\u00f6\u00f6tamisel \u00fcmbritsetakse \u00fchte HTTP-k\u00e4sitlejat teisega, mis v\u00f5imaldab kiiresti teostada autentimist, tihendamist, logimist ja m\u00f5ningaid muid funktsioone.<\/p>\n<p>N\u00e4iteks vaatame http.Handler liidest, millega kirjutame HTTP-k\u00e4sitleja, mis teostab teenuse kasutajate autentimist.<\/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\u00e4ivita algne k\u00e4sitleja\n        next.ServeHTTP(w, r)\n    })\n}<\/code><\/pre>\n<p>\nOn ka kolmandate osapoolte marsruuterid, nagu chi, mis v\u00f5imaldavad laiendada vahekihit\u00f6\u00f6tluse funktsionaalsust.<\/p>\n<h3>T\u00f6\u00f6tamine staatiliste failidega<\/h3>\n<p>\nGo standardraamatukogus on olemas v\u00f5imalused staatilise sisu t\u00f6\u00f6tlemiseks, sealhulgas piltide ning JavaScripti ja CSS-failide jaoks. Neile p\u00e4\u00e4seb juurde funktsiooni http.FileServer kaudu, mis tagastab t\u00f6\u00f6tleja, mis jagab faile m\u00e4\u00e4ratud kataloogist.<\/p>\n<pre><code class=\"go\">func NewRouter() http.Handler {\n    router := chi.NewRouter()\n    r.Get(\"\/{name}\", HelloName)\n\n\/\/ Staatiliste failide jagamise seadistus\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 katalooge ainult siis, kui seal ei ole p\u00f5hifaili index.html. Sellisel juhul, et v\u00e4ltida katalooge riskimist, tuleks kasutada paketti <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jordan-wright\/unindexed\"><code>unindexed<\/code><\/a><\/noindex>.<\/p>\n<h3>Korrektselt t\u00f6\u00f6 l\u00f5petamine<\/h3>\n<p>\nGo-s on olemas ka selline funktsioon nagu HTTP-serveri korrektselt t\u00f6\u00f6 l\u00f5petamine. Seda saab teha meetodi Shutdown() abil. Server k\u00e4ivitatakse goroutine'is ning seej\u00e4rel kuulatakse signaali katkestamise vastuv\u00f5tmiseks. Nii varsti 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 \u2014 v\u00f5imas keel, millel on praktiliselt universaalne standardraamatukogu. Selle vaikimisi v\u00f5imalused on \u00fcsna laiad, 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>Kaheaastane praktiline kursus <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/\">\u201eMa olen PRO veebiarendaja\u201c<\/a><\/noindex>.<\/li>\n<li>Hariduslik veebikursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/java\/\">\u201eJava-arendaja amet\u201c<\/a><\/noindex>.<\/li>\n<li>Praktiline aastakursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/\">\u201ePHP arendaja algusest PRO-ni\u201c<\/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-novosti-interneta"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - 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 \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\" \/>\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\/novosti-interneta\/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/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\udd47Golangiga veebiserverite arendamine \u2014 lihtsast keeruliseni | ProHoster","description":"Viis aastat tagasi hakkasin ma arendama Gophish'i, mis andis v\u00f5imaluse \u00f5ppida Golangi. Ma sain aru, et Go on v\u00f5imas keel, mille v\u00f5imalusi t\u00e4iendab hulk raamatukogusid. Go on universaalne: eelk\u00f5ige saab sellega probleemideta luua serveri rakendusi. See artikkel r\u00e4\u00e4gib serveri kirjutamisest Go-s. Alustame lihtsatest asjadest, nagu \"Tere maailm!\", ja l\u00f5petame rakendusega,","canonical_url":"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/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 \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","og:url":"https:\/\/prohoster.info\/et\/blog\/novosti-interneta\/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"},"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}]}}