{"id":447704,"date":"2025-02-10T15:06:13","date_gmt":"2025-02-10T15:06:13","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=447704"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=447704","title":{"rendered":"<span>\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0438 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432 Golang: \u0440\u0430\u0437\u0431\u043e\u0440 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434. \u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 \u0435\u0433\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435,  \u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0442\u0435\u0441\u044c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438. <\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u043b\u043e\u043c\u0430\u0439\u0442\u0435: \u0418\u0437\u0431\u0430\u0432\u044c\u0442\u0435\u0441\u044c \u043e\u0442 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e \u044d\u0442\u0430\u043f\u043e\u0432, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0438\u0441\u044c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438: \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0439\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0423\u0432\u0438\u0434\u0435\u0432 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0441\u044c. \u041d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0439 \u043d\u0430 \u0432\u0435\u0440\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0443\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 \u0441\u0432\u044f\u0437\u0438: \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0434\u0435\u044e . \u0421\u0442\u0430\u0440\u0430\u0439\u0441\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0432\u044f\u0437\u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0448\u044c \u043a\u043e\u0434<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/9b6\/558\/d2e\/9b6558d2efee31aa5b93fd75195d4902.jpg\" width=\"642\" height=\"389\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9b6\/558\/d2e\/9b6558d2efee31aa5b93fd75195d4902.jpg\" data-blurred=\"true\"\/><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0440\u0438\u0438 <strong>&#171;Mastering Go Concurrency&#187;<\/strong>. \u0412 \u043d\u0435\u0439 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438 \u0438\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0449\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0411\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u044f \u043d\u0430\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u0438\u043d\u0442\u0443\u0438\u0446\u0438\u044e \u0434\u043b\u044f \u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043b\u0433\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0431\u0435\u0440\u0438\u0442\u0435\u0441\u044c \u0442\u0435\u0440\u043f\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041c\u044b \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string) {     fmt.Printf(\"Starting download: %s\\n\", filename)     \/\/ Simulate file download with sleep     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      startTime := time.Now()      downloadFile(\"file1.txt\")     downloadFile(\"file2.txt\")     downloadFile(\"file3.txt\")      elapsedTime := time.Since(startTime)      fmt.Printf(\"All downloads completed! Time elapsed: %s\\n\", elapsedTime)  \/\/ Starting downloads... \/\/ Starting download: filel.txt \/\/ Finished download: filel.txt \/\/ Starting download: file2.txt \/\/ Finished download: file2.txt \/\/ Starting download: file3.txt \/\/ Finished download: file3.txt \/\/ All downloads completed! Time elapsed: 6s \/\/ Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/GklK7Poy5Cc\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u044f\u043b\u043e 6 \u0441\u0435\u043a\u0443\u043d\u0434, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>downloadFile<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e: <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/083\/e58\/2ad\/083e582ada314d662b9dec7701a0f0b4.jpg\" alt=\"\u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 2 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0418\u0442\u043e\u0433\u043e 6\u0441\" title=\"\u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 2 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0418\u0442\u043e\u0433\u043e 6\u0441\" width=\"800\" height=\"200\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/083\/e58\/2ad\/083e582ada314d662b9dec7701a0f0b4.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 2 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0418\u0442\u043e\u0433\u043e 6\u0441<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u0434\u0430\u0432\u0430\u0439 \u0432\u043d\u0435\u0441\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b: <\/p>\n<blockquote>\n<p>\u0432\u0430\u0436\u043d\u043e: \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f `go`<\/p>\n<\/blockquote>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string) {     fmt.Printf(\"Starting download: %s\\n\", filename)     \/\/ Simulate file download with sleep     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      \/\/ Launch downloads concurrently     go downloadFile(\"file1.txt\")     go downloadFile(\"file2.txt\")     go downloadFile(\"file3.txt\")      fmt.Println(\"All downloads completed!\") }  \/\/ Starting downloads... \/\/ All downloads completed! \/\/ Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/zdDsswJ7vTb\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u041f\u043e\u0433\u043e\u0434\u0438, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0448\u044c \u043f\u043e\u0447\u0435\u043c\u0443?<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7da\/eb3\/8b9\/7daeb38b97f887a524dfe10f7c9d423e.jpg\" alt=\"\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \" title=\"\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \" width=\"800\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7da\/eb3\/8b9\/7daeb38b97f887a524dfe10f7c9d423e.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. <\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f main \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0414\u041e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0432\u043e\u0434: <\/p>\n<blockquote>\n<p>\u0412\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c: \u0424\u0443\u043d\u043a\u0446\u0438 main \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u0430 \u0436\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430. <\/p>\n<\/blockquote>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b main \u0434\u043e\u0436\u0434\u0430\u043b\u0430\u0441\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u044b \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434(\u043a\u043e\u0441\u0442\u044b\u043b\u044c)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>WaitGroup<\/code> (\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u043e \u043d\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>\u043a\u0430\u043d\u0430\u043b\u044b<\/strong> (\u043e \u043d\u0438\u0445 \u0434\u0430\u043b\u044c\u0448\u0435)<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e. \u0441\u0435\u043a\u0443\u043d\u0434 \u0447\u0442\u043e\u0431\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c.<\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string) {     fmt.Printf(\"Starting download: %s\\n\", filename)     \/\/ Simulate file download with sleep     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      startTime := time.Now() \/\/ Record start time      go downloadFile(\"file1.txt\")     go downloadFile(\"file2.txt\")     go downloadFile(\"file3.txt\")      \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d     time.Sleep(3 * time.Second)      elapsedTime := time.Since(startTime)      fmt.Printf(\"All downloads completed! Time elapsed: %s\\n\", elapsedTime)<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/KnzPS7y9qO8\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u0443\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b  \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0437\u043d\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e, \u043d\u043e \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u043d\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0435\u0439\u0441\u0430\u0445. <\/p>\n<h2>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a WaitGroup<\/h2>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f `sync.WaitGroup`, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f wg \u043c\u043e\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d. <\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"sync\"     \"time\" )  func downloadFile(filename string, wg *sync.WaitGroup) {     \/\/ \u0421\u043e\u043e\u0431\u0449\u0438\u043c wg \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     defer wg.Done()      fmt.Printf(\"Starting download: %s\\n\", filename)     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      var wg sync.WaitGroup      \/\/ \u0421\u043e\u043e\u0431\u0449\u0438\u043c wg \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c 3 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b     wg.Add(3)      go downloadFile(\"file1.txt\", &amp;wg)     go downloadFile(\"file2.txt\", &amp;wg)     go downloadFile(\"file3.txt\", &amp;wg)      \/\/ \u0416\u0434\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d     wg.Wait()      fmt.Println(\"All downloads completed!\") }  \/\/ Starting downloads... \/\/ Starting download: file3.txt \/\/ Starting download: filel.txt \/\/ Starting download: file2.txt \/\/ Finished download: file3.txt \/\/ Finished download: filel.txt \/\/ Finished download: file2.txt \/\/ All downloads completed! \/\/ Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/MxT0T74w9eV\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/9e7\/b9e\/a8e\/9e7b9ea8e8cd7cec18a82e8cc3192d71.jpg\" width=\"800\" height=\"433\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e7\/b9e\/a8e\/9e7b9ea8e8cd7cec18a82e8cc3192d71.jpg\" data-blurred=\"true\"\/><\/figure>\n<h4>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 <\/h4>\n<ul>\n<li>\n<p><code>WaitGroup<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>wg.Add(n) \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0430 n <\/p>\n<\/li>\n<li>\n<p>wg.Done() \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0430 1 <\/p>\n<\/li>\n<li>\n<p>wg.Wait() \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 0 <\/p>\n<\/li>\n<\/ul>\n<h4>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<ul>\n<li>\n<p><code>main<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 add(3) \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Done() \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (defer wg.Done()) <\/p>\n<\/li>\n<li>\n<p><code>main<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a wait() \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 0<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u044b\u043c 0, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 <code>main<\/code> \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0427\u0430\u0441\u0442\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">\/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415\u041b\u042c\u0417\u042f  go downloadFile(\"file1.txt\", &amp;wg) wg.Add(1)  \/\/ \u041d\u0430\u0440\u0443\u0448\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a!  \/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415\u041b\u042c\u0417\u042f wg.Add(2)  \/\/ \u041d\u0430\u0440\u0443\u0448\u0435\u043d \u0441\u0447\u0435\u0442\u0447\u0438\u043a go downloadFile(\"file1.txt\", &amp;wg) go downloadFile(\"file2.txt\", &amp;wg) go downloadFile(\"file3.txt\", &amp;wg)  \/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415\u041b\u042c\u0417\u042f func downloadFile(filename string, wg *sync.WaitGroup) {     \/\/ \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d wg.Done()     fmt.Printf(\"Downloading: %s\\n\", filename) }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041a\u0430\u043d\u0430\u043b\u044b<\/h3>\n<p>\u041c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a \u0434\u0432\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u043a\u0430\u043d\u0430\u043b\u044b.<\/p>\n<blockquote>\n<p>\u041a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c \u0447\u0442\u043e \u043a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e &#171;\u0442\u0440\u0443\u0431\u044b&#187;: \u043e\u0434\u043d\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u0443 \u0442\u0440\u0443\u0431\u0443 \u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0435\u0435 \u0437\u0430\u0431\u0440\u0430\u0442\u044c.<\/p>\n<\/blockquote>\n<p>\u0432\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 <\/p>\n<ol>\n<li>\n<p>\u041a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u043d\u0430\u043b <code>ch &lt;- value <\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 .<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>&lt;-ch<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">package main  import \"fmt\"  func main() {     \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b     ch := make(chan string)      \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b(main \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f)     ch &lt;- \"hello\"  \/\/ \u0442\u0443\u0442 deadlock!      \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430     msg := &lt;-ch     fmt.Println(msg) } \/\/fatal error: all goroutines are asleep - deadlock! \/\/goroutine 1 [chan send]: \/\/main.main () \/\/ \/ tmp\/sandbox364224576\/prog.go: 10 +0x36 \/\/Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/pHsIl_WHhSp\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0434\u0435\u0434\u043b\u043e\u043a \u0432 <code>ch &lt;- \"hello\"<\/code> ? \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438\/\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u043d\u0430\u043b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 main \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u0442 \u0438\u0437 \u043d\u0435\u0433\u043e, \u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043d\u0435\u0442 \u0438 \u043c\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 &#8212; deadlock. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3dc\/56b\/a13\/3dc56ba138e2df20e89b2a2e1fa356e7.png\" width=\"800\" height=\"266\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3dc\/56b\/a13\/3dc56ba138e2df20e89b2a2e1fa356e7.png\"\/><\/figure>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c<\/p>\n<pre><code class=\"go\">package main  import \"fmt\"  func main() {     ch := make(chan string)      \/\/ \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u043d\u0430\u043b     go func() {         ch &lt;- \"hello\"  \/\/ \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 main \u0442\u043e\u0436\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430     }()      \/\/ main \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435      msg := &lt;-ch  \/\/ \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0447\u0442\u0435\u043d\u0438\u044f     fmt.Println(msg) }<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/F1PvTyF7WQT\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/169\/137\/e42\/169137e42606e2c725d2006037103b65.png\" width=\"800\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/169\/137\/e42\/169137e42606e2c725d2006037103b65.png\"\/><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435, main \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438 \u0441\u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u043d\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0432\u0448\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b \u0431\u044b\u043b\u0430 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u043f\u043e\u043a\u0430 main \u043d\u0435 \u043f\u0440\u043e\u0447\u0435\u043b \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c)<\/p>\n<p>\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e main \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u043b\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438. <\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string, done chan bool) {     fmt.Printf(\"Starting download: %s\\n\", filename)     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename)      done &lt;- true \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 }  func main() {     fmt.Println(\"Starting downloads...\")      startTime := time.Now()      \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d     done := make(chan bool)      go downloadFile(\"file1.txt\", done)     go downloadFile(\"file2.txt\", done)     go downloadFile(\"file3.txt\", done)      \/\/ \u0416\u0434\u0435\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438     for i := 0; i &lt; 3; i++ {         &lt;-done \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b      }      elapsedTime := time.Since(startTime)     fmt.Printf(\"All downloads completed! Time elapsed: %s\\n\", elapsedTime) }  \/\/Starting downloads... \/\/Starting download: file3.txt \/\/Starting download: file2.txt \/\/Starting download: filel.txt \/\/Finished download: filel.txt \/\/Finished download: file2.txt \/\/Finished download: file3.txt \/\/All downloads completed! Time elapsed: 2s \/\/Program<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/rFveusvu7WO\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/959\/91c\/3d0\/95991c3d0258e32c48592298bf496fa2.png\" width=\"800\" height=\"500\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/959\/91c\/3d0\/95991c3d0258e32c48592298bf496fa2.png\"\/><\/figure>\n<p>\u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/go.dev\/play\/p\/wFNQKzl6NP8\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c\u0441\u044f<\/a>, \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441 3 \u043d\u0430 2.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c.<\/p>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a<\/h4>\n<ol>\n<li>\n<p>main \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b done<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0442\u0440\u0435\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u0430\u043d\u0430\u043b<\/p>\n<\/li>\n<\/ol>\n<h4>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<ol>\n<li>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e <\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439<\/p>\n<\/li>\n<\/ol>\n<h4>\u0426\u0438\u043a\u043b<\/h4>\n<ol>\n<li>\n<p>Main \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0446\u0438\u043a\u043b <code>for i := 0; i &lt; 3; i++<\/code><\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 <code>&lt;-done<\/code> (\u0431\u0435\u0437 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f) \u043f\u043e \u0441\u0443\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043b\u044f main <\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec9\/874\/071\/ec98740719b5744ab41320c1fd9c1050.png\" width=\"800\" height=\"413\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec9\/874\/071\/ec98740719b5744ab41320c1fd9c1050.png\"\/><\/figure>\n<h4>\u0426\u0438\u043a\u043b<\/h4>\n<ol>\n<li>\n<p>&lt;-done \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 main \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u043d\u044c\u0448\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0434\u0435\u0434\u043b\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 \u0432 \u043a\u0430\u043d\u0430\u043b done \u0441\u0438\u0433\u043d\u0430\u043b, \u0430 main \u043f\u0440\u043e\u0447\u0435\u0442 \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0446\u0438\u043a\u043b\u0430<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0441\u044f \u0442\u0440\u0438\u0436\u0434\u044b <\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u0440\u0438\u0439\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p>\u2b50 \u041a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c (done &lt;- true) \u0438\u043c\u0435\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0447\u0442\u0435\u043d\u0438\u0439 (&lt;-done)<\/p>\n<p>\u2b50 Main \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0446\u0438\u043a\u043b <\/p>\n<\/blockquote>\n<h3>\u041a\u0430\u043a \u0434\u0432\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f<\/h3>\n<p>\u041c\u044b \u0443\u0436\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438 \u043a\u0430\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. <strong>\u0412\u0435\u0434\u044c main \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430!<\/strong><\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func sender(ch chan string, done chan bool) {     for i := 1; i &lt;= 3; i++ {         ch &lt;- fmt.Sprintf(\"message %d\", i)         time.Sleep(100 * time.Millisecond)     }     close(ch) \/\/ \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438     done &lt;- true }  func receiver(ch chan string, done chan bool) {         \/\/ range \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b \u043f\u043e\u043a\u0430 \u043e\u043d \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f(\u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0435\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c)     for msg := range ch {         fmt.Println(\"Received:\", msg)     }     done &lt;- true }  func main() {     ch := make(chan string)     senderDone := make(chan bool)     receiverDone := make(chan bool)      go sender(ch, senderDone)     go receiver(ch, receiverDone)      \/\/ \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     &lt;-senderDone     &lt;-receiverDone      fmt.Println(\"All operations completed!\") }<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/o5R4ulLFe2f\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c \u043a\u043e\u0434<\/a><\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a(t=0ms)<\/h4>\n<ul>\n<li>\n<p>\u043c\u0430\u0438\u043d \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 3 \u043a\u0430\u043d\u0430\u043b\u0430<\/p>\n<p><code>ch<\/code> &#8212; \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/p>\n<p><code>senderDone <\/code>&#8212; \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438<\/p>\n<p><code>receiverDone <\/code>&#8212; \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0438\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 2 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b<\/p>\n<p>sender<\/p>\n<p>receiver<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0438\u043d \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0436\u0434\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438<\/p>\n<h4>\u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (t=1ms)<\/h4>\n<ol>\n<li>\n<p>sender \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>\"message 1\"<\/code> \u0432 \u043a\u0430\u043d\u0430\u043b <code>ch<\/code>.<\/p>\n<\/li>\n<li>\n<p>receiver \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: <\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u0442: <code>\"Received: message 1\"<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u0442 \u043d\u0430 100 \u043c\u0441.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0412\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (t=101ms)<\/h4>\n<ol>\n<li>\n<p>sender \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>\"message 2\"<\/code> \u0432 \u043a\u0430\u043d\u0430\u043b <code>ch<\/code>.<\/p>\n<\/li>\n<li>\n<p>receiver \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: <\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u0442: <code>\"Received: message 2\"<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u0442 \u043d\u0430 100 \u043c\u0441.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0422\u0440\u0435\u0442\u044c\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (t=201ms)<\/h4>\n<ol>\n<li>\n<p>sender \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>\"message 3\"<\/code> \u0432 \u043a\u0430\u043d\u0430\u043b <code>ch<\/code>.<\/p>\n<\/li>\n<li>\n<p>receiver \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: <\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u0442: <code>\"Received: message 3\"<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u0442 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 (t=301ms)<\/h4>\n<ol>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0441\u043e\u043d \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b <code>ch<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b <code>true<\/code> \u0432 \u043a\u0430\u043d\u0430\u043b <code>senderDone<\/code>, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u043d\u0430\u043b <code>ch<\/code> \u0437\u0430\u043a\u0440\u044b\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 <code>for-range<\/code>.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 (t=302-303ms)<\/h4>\n<ol>\n<li>\n<p>\u043c\u0430\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 <code>senderDone<\/code> \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0438\u043d \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e  \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 <code>receiverDone<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0432 \u043a\u0430\u043d\u0430\u043b <code>receiverDone<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442: <\/p>\n<ul>\n<li>\n<p><code>\"All operations completed!\"<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h3>\u0411\u0443\u0444\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b<\/h3>\n<h4>\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b?<\/h4>\n<p>\u041d\u0435\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043a\u0430\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u0430. \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<h3>\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430<\/h3>\n<ol>\n<li>\n<p>FIFO (\u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u0448\u0435\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0448\u0435\u043b &#8212; \u043e\u0447\u0435\u0440\u0435\u0434\u044c)<\/p>\n<\/li>\n<li>\n<p>\u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0435\u0441\u043b\u0438 \u043a\u0430\u043d\u0430\u043b (\u0431\u0443\u0444\u0435\u0440) \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d<\/p>\n<\/li>\n<li>\n<p>\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u043b\u0438 \u043a\u0430\u043d\u0430\u043b \u043f\u0443\u0441\u0442<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/42b\/49c\/e2f\/42b49ce2f77c8a480d73d3284a423534.png\" width=\"800\" height=\"593\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/42b\/49c\/e2f\/42b49ce2f77c8a480d73d3284a423534.png\"\/><\/figure>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func main() {     \/\/ \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0431\u0443\u0444\u0444 \u043a\u0430\u043d\u0430\u043b \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\u044e 2     ch := make(chan string, 2)      \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u0443\u0444\u0444\u0435\u0440 \u0432\u043c\u0435\u0449\u0430\u0435\u0442     ch &lt;- \"first\"     fmt.Println(\"Sent first message\")     ch &lt;- \"second\"     fmt.Println(\"Sent second message\")      \/\/ \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a     \/\/ ch &lt;- \"third\"  \/\/ \u0440\u0430\u0437\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439      \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430     fmt.Println(&lt;-ch)  \/\/ \"first\"     fmt.Println(&lt;-ch)  \/\/ \"second\"  \/\/ Sent first message \/\/ Sent second message first second \/\/ Program exited. }<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/wFcIBO4n5E2\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 (main)?<\/h3>\n<ol>\n<li>\n<p>\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0431\u0443\u0444\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u043a\u0430\u043d\u0430\u043b \u0434\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0443\u0444\u0435\u0440 \u0443\u0436\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u0434\u0432\u0443\u043c\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0434\u0435\u0434\u043b\u043e\u043a\u0443 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438(\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442)<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a main \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430\u0436\u0434\u044b \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0431\u043b\u043e\u043a\u0443<\/p>\n<\/li>\n<\/ol>\n<p>\u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u043d\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3e9\/23e\/49d\/3e923e49d2e2b5ddb05dd65a281df997.png\" width=\"624\" height=\"244\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3e9\/23e\/49d\/3e923e49d2e2b5ddb05dd65a281df997.png\"\/><\/figure>\n<h3>\u041a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u0411\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u0430\u043d\u0430\u043b \u0431\u0435\u0437 \u0431\u0443\u0444\u0435\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u0426\u0435\u043b\u044c<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0427\u0442\u043e\u0431\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c(\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c) \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u044f\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u0435\u0437 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u0415\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0430\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0435\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u043b\u043e\u043d<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432 \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u041c\u043e\u0436\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0438\u0437-\u0437\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u043f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u0437-\u0437\u0430 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043e\u043f \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0431\u0443\u0444\u0435\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u043e\u043f \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u0440\u043e\u0433\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"176\" width=\"176\">\n<p align=\"left\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">\u0414\u0435\u0434\u043b\u043e\u043a \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0435\u0434\u043b\u043e\u043a \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f\/\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b<\/h4>\n<h3>\u2705 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b, \u0435\u0441\u043b\u0438:<\/h3>\n<ol>\n<li>\n<p>\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u044f\u0437\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c \u0437\u0430 \u0441\u0447\u0451\u0442 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439<strong> <\/strong>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439<strong> <\/strong>\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0442\u0435\u0440\u043f\u0435\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d.<\/p>\n<\/li>\n<\/ol>\n<h3>\u2705 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043d\u0435\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b, \u0435\u0441\u043b\u0438:<\/h3>\n<ol>\n<li>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e.<\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<h4>\u042d\u0442\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0442\u0435\u043c.<\/h4>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<p>\ud83d\udccc <strong>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0441\u0442:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438<\/strong><\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/881014\/\"> https:\/\/habr.com\/ru\/articles\/881014\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434. \u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 \u0435\u0433\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435,  \u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0442\u0435\u0441\u044c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438. <\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u043b\u043e\u043c\u0430\u0439\u0442\u0435: \u0418\u0437\u0431\u0430\u0432\u044c\u0442\u0435\u0441\u044c \u043e\u0442 \u043a\u0430\u043a\u0438\u0445 \u0442\u043e \u044d\u0442\u0430\u043f\u043e\u0432, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0438\u0441\u044c \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438: \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0439\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0423\u0432\u0438\u0434\u0435\u0432 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0441\u044c. \u041d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0439 \u043d\u0430 \u0432\u0435\u0440\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0443\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 \u0441\u0432\u044f\u0437\u0438: \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0434\u0435\u044e . \u0421\u0442\u0430\u0440\u0430\u0439\u0441\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0432\u044f\u0437\u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0448\u044c \u043a\u043e\u0434<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0440\u0438\u0438 <strong>&#171;Mastering Go Concurrency&#187;<\/strong>. \u0412 \u043d\u0435\u0439 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438 \u0438\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0449\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0411\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u044f \u043d\u0430\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u0438\u043d\u0442\u0443\u0438\u0446\u0438\u044e \u0434\u043b\u044f \u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043b\u0433\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0431\u0435\u0440\u0438\u0442\u0435\u0441\u044c \u0442\u0435\u0440\u043f\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041c\u044b \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string) {     fmt.Printf(\"Starting download: %s\\n\", filename)     \/\/ Simulate file download with sleep     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      startTime := time.Now()      downloadFile(\"file1.txt\")     downloadFile(\"file2.txt\")     downloadFile(\"file3.txt\")      elapsedTime := time.Since(startTime)      fmt.Printf(\"All downloads completed! Time elapsed: %s\\n\", elapsedTime)  \/\/ Starting downloads... \/\/ Starting download: filel.txt \/\/ Finished download: filel.txt \/\/ Starting download: file2.txt \/\/ Finished download: file2.txt \/\/ Starting download: file3.txt \/\/ Finished download: file3.txt \/\/ All downloads completed! Time elapsed: 6s \/\/ Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/GklK7Poy5Cc\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u044f\u043b\u043e 6 \u0441\u0435\u043a\u0443\u043d\u0434, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>downloadFile<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e: <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 2 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0418\u0442\u043e\u0433\u043e 6\u0441<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u0434\u0430\u0432\u0430\u0439 \u0432\u043d\u0435\u0441\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b: <\/p>\n<blockquote>\n<p>\u0432\u0430\u0436\u043d\u043e: \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f `go`<\/p>\n<\/blockquote>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string) {     fmt.Printf(\"Starting download: %s\\n\", filename)     \/\/ Simulate file download with sleep     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      \/\/ Launch downloads concurrently     go downloadFile(\"file1.txt\")     go downloadFile(\"file2.txt\")     go downloadFile(\"file3.txt\")      fmt.Println(\"All downloads completed!\") }  \/\/ Starting downloads... \/\/ All downloads completed! \/\/ Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/zdDsswJ7vTb\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u041f\u043e\u0433\u043e\u0434\u0438, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0448\u044c \u043f\u043e\u0447\u0435\u043c\u0443?<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. <\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f main \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0414\u041e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0432\u043e\u0434: <\/p>\n<blockquote>\n<p>\u0412\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c: \u0424\u0443\u043d\u043a\u0446\u0438 main \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u0430 \u0436\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430. <\/p>\n<\/blockquote>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b main \u0434\u043e\u0436\u0434\u0430\u043b\u0430\u0441\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u044b \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434(\u043a\u043e\u0441\u0442\u044b\u043b\u044c)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>WaitGroup<\/code> (\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u043e \u043d\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>\u043a\u0430\u043d\u0430\u043b\u044b<\/strong> (\u043e \u043d\u0438\u0445 \u0434\u0430\u043b\u044c\u0448\u0435)<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0434\u043e\u0436\u0434\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e. \u0441\u0435\u043a\u0443\u043d\u0434 \u0447\u0442\u043e\u0431\u044b \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c.<\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string) {     fmt.Printf(\"Starting download: %s\\n\", filename)     \/\/ Simulate file download with sleep     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      startTime := time.Now() \/\/ Record start time      go downloadFile(\"file1.txt\")     go downloadFile(\"file2.txt\")     go downloadFile(\"file3.txt\")      \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d     time.Sleep(3 * time.Second)      elapsedTime := time.Since(startTime)      fmt.Printf(\"All downloads completed! Time elapsed: %s\\n\", elapsedTime)<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/KnzPS7y9qO8\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u0443\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b  \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0437\u043d\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e, \u043d\u043e \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u043d\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0435\u0439\u0441\u0430\u0445. <\/p>\n<h2>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a WaitGroup<\/h2>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f `sync.WaitGroup`, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f wg \u043c\u043e\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d. <\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"sync\"     \"time\" )  func downloadFile(filename string, wg *sync.WaitGroup) {     \/\/ \u0421\u043e\u043e\u0431\u0449\u0438\u043c wg \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     defer wg.Done()      fmt.Printf(\"Starting download: %s\\n\", filename)     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename) }  func main() {     fmt.Println(\"Starting downloads...\")      var wg sync.WaitGroup      \/\/ \u0421\u043e\u043e\u0431\u0449\u0438\u043c wg \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c 3 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b     wg.Add(3)      go downloadFile(\"file1.txt\", &amp;wg)     go downloadFile(\"file2.txt\", &amp;wg)     go downloadFile(\"file3.txt\", &amp;wg)      \/\/ \u0416\u0434\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d     wg.Wait()      fmt.Println(\"All downloads completed!\") }  \/\/ Starting downloads... \/\/ Starting download: file3.txt \/\/ Starting download: filel.txt \/\/ Starting download: file2.txt \/\/ Finished download: file3.txt \/\/ Finished download: filel.txt \/\/ Finished download: file2.txt \/\/ All downloads completed! \/\/ Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/MxT0T74w9eV\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e:<\/p>\n<figure class=\"full-width\"><\/figure>\n<h4>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 <\/h4>\n<ul>\n<li>\n<p><code>WaitGroup<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>wg.Add(n) \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0430 n <\/p>\n<\/li>\n<li>\n<p>wg.Done() \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0430 1 <\/p>\n<\/li>\n<li>\n<p>wg.Wait() \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 0 <\/p>\n<\/li>\n<\/ul>\n<h4>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<ul>\n<li>\n<p><code>main<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 add(3) \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Done() \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (defer wg.Done()) <\/p>\n<\/li>\n<li>\n<p><code>main<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a wait() \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 0<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u044b\u043c 0, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 <code>main<\/code> \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0427\u0430\u0441\u0442\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">\/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415\u041b\u042c\u0417\u042f  go downloadFile(\"file1.txt\", &amp;wg) wg.Add(1)  \/\/ \u041d\u0430\u0440\u0443\u0448\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a!  \/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415\u041b\u042c\u0417\u042f wg.Add(2)  \/\/ \u041d\u0430\u0440\u0443\u0448\u0435\u043d \u0441\u0447\u0435\u0442\u0447\u0438\u043a go downloadFile(\"file1.txt\", &amp;wg) go downloadFile(\"file2.txt\", &amp;wg) go downloadFile(\"file3.txt\", &amp;wg)  \/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415\u041b\u042c\u0417\u042f func downloadFile(filename string, wg *sync.WaitGroup) {     \/\/ \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d wg.Done()     fmt.Printf(\"Downloading: %s\\n\", filename) }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041a\u0430\u043d\u0430\u043b\u044b<\/h3>\n<p>\u041c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a \u0434\u0432\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u043a\u0430\u043d\u0430\u043b\u044b.<\/p>\n<blockquote>\n<p>\u041a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c \u0447\u0442\u043e \u043a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e &#171;\u0442\u0440\u0443\u0431\u044b&#187;: \u043e\u0434\u043d\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u0443 \u0442\u0440\u0443\u0431\u0443 \u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0435\u0435 \u0437\u0430\u0431\u0440\u0430\u0442\u044c.<\/p>\n<\/blockquote>\n<p>\u0432\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 <\/p>\n<ol>\n<li>\n<p>\u041a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u043d\u0430\u043b <code>ch &lt;- value <\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 .<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>&lt;-ch<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"go\">package main  import \"fmt\"  func main() {     \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b     ch := make(chan string)      \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b(main \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f)     ch &lt;- \"hello\"  \/\/ \u0442\u0443\u0442 deadlock!      \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430     msg := &lt;-ch     fmt.Println(msg) } \/\/fatal error: all goroutines are asleep - deadlock! \/\/goroutine 1 [chan send]: \/\/main.main () \/\/ \/ tmp\/sandbox364224576\/prog.go: 10 +0x36 \/\/Program exited.<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/pHsIl_WHhSp\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<p>\u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0434\u0435\u0434\u043b\u043e\u043a \u0432 <code>ch &lt;- \"hello\"<\/code> ? \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u043d\u0430\u043b\u044b \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438\/\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u043d\u0430\u043b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 main \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u0442 \u0438\u0437 \u043d\u0435\u0433\u043e, \u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043d\u0435\u0442 \u0438 \u043c\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 &#8212; deadlock. <\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c<\/p>\n<pre><code class=\"go\">package main  import \"fmt\"  func main() {     ch := make(chan string)      \/\/ \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u043d\u0430\u043b     go func() {         ch &lt;- \"hello\"  \/\/ \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 main \u0442\u043e\u0436\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430     }()      \/\/ main \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435      msg := &lt;-ch  \/\/ \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0447\u0442\u0435\u043d\u0438\u044f     fmt.Println(msg) }<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/F1PvTyF7WQT\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435, main \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438 \u0441\u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u043d\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0432\u0448\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b \u0431\u044b\u043b\u0430 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u043f\u043e\u043a\u0430 main \u043d\u0435 \u043f\u0440\u043e\u0447\u0435\u043b \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c)<\/p>\n<p>\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e main \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u043b\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438. <\/p>\n<pre><code class=\"go\">package main  import (     \"fmt\"     \"time\" )  func downloadFile(filename string, done chan bool) {     fmt.Printf(\"Starting download: %s\\n\", filename)     time.Sleep(2 * time.Second)     fmt.Printf(\"Finished download: %s\\n\", filename)      done &lt;- true \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 }  func main() {     fmt.Println(\"Starting downloads...\")      startTime := time.Now()      \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d     done := make(chan bool)      go downloadFile(\"file1.txt\", done)     go downloadFile(\"file2.txt\", done)     go downloadFile(\"file3.txt\", done)      \/\/ \u0416\u0434\u0435\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438     for i := 0; i &lt; 3; i++ {         &lt;-done \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b      }      elapsedTime := time.Since(startTime)     fmt.Printf(\"All downloads completed! Time elapsed: %s\\n\", elapsedTime) }  \/\/Starting downloads... \/\/Starting download: file3.txt \/\/Starting download: file2.txt \/\/Starting download: filel.txt \/\/Finished download: filel.txt \/\/Finished download: file2.txt \/\/Finished download: file3.txt \/\/All downloads completed! Time elapsed: 2s \/\/Program<\/code><\/pre>\n<p><a href=\"https:\/\/go.dev\/play\/p\/rFveusvu7WO\" rel=\"noopener noreferrer nofollow\">\u0442\u044b\u043a<\/a><\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/go.dev\/play\/p\/wFNQKzl6NP8\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c\u0441\u044f<\/a>, \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441 3 \u043d\u0430 2.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c.<\/p>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a<\/h4>\n<ol>\n<li>\n<p>main \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b done<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0442\u0440\u0435\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u0430\u043d\u0430\u043b<\/p>\n<\/li>\n<\/ol>\n<h4>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<ol>\n<li>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e <\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439<\/p>\n<\/li>\n<\/ol>\n<h4>\u0426\u0438\u043a\u043b<\/h4>\n<ol>\n<li>\n<p>Main \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0446\u0438\u043a\u043b <code>for i := 0; i &lt; 3; i++<\/code><\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 <code>&lt;-done<\/code> (\u0431\u0435\u0437 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f) \u043f\u043e \u0441\u0443\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043b\u044f main <\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><\/figure>\n<h4>\u0426\u0438\u043a\u043b<\/h4>\n<ol>\n<li>\n<p>&lt;-done \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 main \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043d\u0435\u0442<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-447704","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/447704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=447704"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/447704\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=447704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=447704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=447704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}