{"id":6279,"date":"2022-05-31T11:02:48","date_gmt":"2022-05-31T10:02:48","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=6279"},"modified":"2022-06-20T17:50:39","modified_gmt":"2022-06-20T16:50:39","slug":"go-simple-async-function","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/go-simple-async-function\/","title":{"rendered":"Go Simple &#8216;Async&#8217; function"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package main\n\nimport (\n\t\"fmt\"\n\t\"math\/rand\"\n\t\"time\"\n)\n\nfunc main() {\n\tdefer fmt.Println(\"Finished\")\n\tfmt.Println(\"Hello world\")\n\n\tvar results = requestAll([]string{\"http:\/\/test.com\", \"http:\/\/test2.com\"})\n\tfor _, result := range results {\n\t\tfmt.Printf(\"Result: %s\\n\", result)\n\t}\n}\n\nfunc mockHTTPRequest(url string) string {\n\ttimeDelay := rand.Intn(3000)\n\ttime.Sleep(time.Duration(timeDelay) * time.Millisecond)\n\treturn fmt.Sprintf(\"OK: Request %s %d ms\\n\", url, timeDelay)\n}\n\nfunc requestAll(urls []string) []string {\n\tvar length = len(urls)\n\trequests := make(chan string, length)\n\tdefer close(requests)\n\t\/\/ Use goroutine to send multiple time-consuming jobs to the channel.\n\tfor _, url := range urls {\n\t\tgo func(url2 string) {\n\t\t\trequests &lt;- mockHTTPRequest(url2)\n\t\t}(url)\n\t}\n\tvar responses = make([]string, 0, length)\n\tfor i := 0; i &lt; length; i++ {\n\t\tvar response = &lt;-requests\n\t\tresponses = append(responses, response)\n\t}\n\treturn responses\n}\n<\/pre>\n\n\n\n<p>Extended example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net\/http\"\n\t\"os\"\n\t\"time\"\n)\n\ntype Download interface {\n\tgetFile() string\n\tgetUrl() string\n\tgetDuration() time.Duration\n\tsetDuration(value time.Duration)\n\tgetError() error\n\tsetError(value error)\n}\n\ntype DownloadInfo struct {\n\tfile     string\n\turl      string\n\terr      error\n\tduration time.Duration\n}\n\nfunc (r *DownloadInfo) getFile() string {\n\treturn r.file\n}\n\nfunc (r *DownloadInfo) getUrl() string {\n\treturn r.url\n}\n\nfunc (r *DownloadInfo) setDuration(value time.Duration) {\n\tr.duration = value\n}\n\nfunc (r *DownloadInfo) getDuration() time.Duration {\n\treturn r.duration\n}\n\nfunc (r *DownloadInfo) setError(value error) {\n\tr.err = value\n}\n\nfunc (r *DownloadInfo) getError() error {\n\treturn r.err\n}\n\nfunc createDownload(url string, file string) *DownloadInfo {\n\treturn &amp;DownloadInfo{\n\t\turl:      url,\n\t\tfile:     file,\n\t\tduration: 0,\n\t}\n}\n\nfunc main() {\n\tdefer fmt.Println(\"Finished\")\n\tfmt.Println(\"Hello world\")\n\tvar data = []Download{\n\t\tcreateDownload(\"https:\/\/download.visualstudio.microsoft.com\/download\/pr\/15ab772d-ce5c-46e5-a90e-57df11adabfb\/4b1b1330b6279a50c398f94cf716c71e\/dotnet-sdk-6.0.301-win-x64.exe\", \"dotnet-sdk-6.0.301-win-x64.exe\"),\n\t\tcreateDownload(\"https:\/\/download.visualstudio.microsoft.com\/download\/pr\/7989338b-8ae9-4a5d-8425-020148016812\/c26361fde7f706279265a505b4d1d93a\/dotnet-runtime-6.0.6-win-x64.exe\", \"dotnet-runtime-6.0.6-win-x64.exe\"),\n\t\tcreateDownload(\"https:\/\/download.visualstudio.microsoft.com\/download\/pr\/test\", \"fail.txt\"),\n\t}\n\tvar results = requestAll(data)\n\tfor _, result := range results {\n\t\tvar err = result.getError()\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Result: %s -X %s\\n\", result.getUrl(), err)\n\t\t} else {\n\t\t\tfmt.Printf(\"Result: %s -> %s : %s\\n\", result.getUrl(), result.getFile(), result.getDuration())\n\t\t}\n\t}\n}\nfunc startDownload(d Download) Download {\n\tvar start = time.Now()\n\n\tfmt.Printf(\"Start: %s\\n\", d.getUrl())\n\tresp, err := http.Get(d.getUrl())\n\tif err != nil {\n\t\t\/\/ setErr(err)\n\t\treturn d\n\t}\n\tdefer resp.Body.Close()\n\n\tvar success = resp.StatusCode >= 200 &amp;&amp; resp.StatusCode &lt; 400\n\tif !success {\n\t\td.setError(fmt.Errorf(\"Failed with exit code %d\", resp.StatusCode))\n\t\treturn d\n\t}\n\n\tout, err := os.Create(d.getFile())\n\tif err != nil {\n\t\treturn d\n\t}\n\tdefer out.Close()\n\n\t_, err = io.Copy(out, resp.Body)\n\tif err != nil {\n\t\treturn d\n\t}\n\n\tvar elapsed = time.Since(start)\n\td.setDuration(elapsed)\n\tfmt.Printf(\"End: %s : %s s\\n\", d.getUrl(), elapsed)\n\treturn d\n}\nfunc requestAll(downloads []Download) []Download {\n\tvar length = len(downloads)\n\trequests := make(chan Download, length)\n\tdefer close(requests)\n\t\/\/ Use goroutine to send multiple time-consuming jobs to the channel.\n\tfor _, d := range downloads {\n\t\tgo func(d2 Download) {\n\t\t\trequests &lt;- startDownload(d2)\n\t\t}(d)\n\t}\n\tvar responses = make([]Download, 0, length)\n\tfor i := 0; i &lt; length; i++ {\n\t\tvar response = &lt;-requests\n\t\tresponses = append(responses, response)\n\t}\n\treturn responses\n}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Extended example:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6279","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/6279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=6279"}],"version-history":[{"count":3,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/6279\/revisions"}],"predecessor-version":[{"id":6328,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/6279\/revisions\/6328"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=6279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=6279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=6279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}