{"id":299401,"date":"2020-02-28T09:00:14","date_gmt":"2020-02-28T09:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=299401"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=299401","title":{"rendered":"\u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432 Go"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/490336\/\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/medium.com\/rungo\/anatomy-of-channels-in-go-concurrency-in-go-1ec336086adb\">&quot;Anatomy of Channels in Go&quot;<\/a> \u0430\u0432\u0442\u043e\u0440\u0430 Uday Hiwarale.<\/p>\n<p>  <\/p>\n<h2 id=\"chto-takoe-kanaly\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043d\u0430\u043b\u044b?<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u043d\u0430\u043b \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0432\u044f\u0437\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 (\u0438\u043b\u0438 \u0442\u0440\u0443\u0431\u0430), \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u2014 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"sozdanie-kanala\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430<\/h2>\n<p>  <\/p>\n<p>Go \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e chan. \u041a\u0430\u043d\u0430\u043b \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func main() {     var c chan int     fmt.Println(c) } <\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/iWOFLfcgfF-\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b <code>c<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c <code>int<\/code>. \u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 <code>&lt;nil&gt;<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 \u2014 \u044d\u0442\u043e <code>nil<\/code>. \u0422\u0430\u043a\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d. \u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043d\u0435 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d (\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d). \u0414\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>make<\/code>. <\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func main() {     c := make(chan int)      fmt.Printf(&quot;type of `c` is %T\\n&quot;, c)     fmt.Printf(&quot;value of `c` is %v\\n&quot;, c) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/N4dU7Ql9bK7\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>:=<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>make<\/code>. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0448\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">type of `c` is chan int value of `c` is 0xc0420160c0<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>c<\/code>, \u044d\u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 go \u043a\u0430\u043d\u0430\u043b\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u043e\u0439, \u0432\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0435 \u043a\u0430\u043d\u0430\u043b \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434. \u0413\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b.<\/p>\n<p>  <\/p>\n<h2 id=\"zapis-i-chtenie-dannyh\">\u0417\u0430\u043f\u0438\u0441\u044c \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>  <\/p>\n<p>Go \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f <code>&lt;-<\/code> \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u043d\u0430\u043b<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">c &lt;- data<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b <code>c<\/code>. \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <code>data<\/code> \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043a\u0430\u043d\u0430\u043b <code>c<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">&lt;- c<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043a\u0430\u043d\u0430\u043b\u0430 <code>c<\/code>. \u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043a\u0430\u043d\u0430\u043b\u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">var data int data = &lt;- c<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>c<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>int<\/code>, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>data<\/code>. \u0422\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">data := &lt;- c<\/code><\/pre>\n<p>  <\/p>\n<p>Go \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u043a\u0430\u043d\u0430\u043b\u0443 <code>c<\/code>, \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 <code>data<\/code> \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043a\u0430\u043d\u0430\u043b\u043e\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u043d\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u043e\u0439 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043d\u0430\u043b\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0442\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>  <\/p>\n<h2 id=\"kanaly-na-praktike\">\u041a\u0430\u043d\u0430\u043b\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h2>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func greet(c chan string) {     fmt.Println(&quot;Hello &quot; + &lt;-c + &quot;!&quot;) }  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan string)      go greet(c)      c &lt;- &quot;John&quot;     fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/OeYLKEz7qKi\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u043e \u0448\u0430\u0433\u0430\u043c:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>greet<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b <code>c<\/code> \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>c<\/code> \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c.<\/li>\n<li>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>main<\/code> \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 <code>&quot;main() started&quot;<\/code>.<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u043c\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>make<\/code>, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b <code>c<\/code> \u0441 \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u044b\u0445 <code>string<\/code>.<\/li>\n<li>\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b <code>\u0441<\/code> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>greet<\/code> \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u0430\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>go<\/code>.<\/li>\n<li>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u0432\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b <code>main<\/code> \u0438 <code>greet<\/code>, <code>main<\/code> \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439.<\/li>\n<li>\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b <code>\u0441<\/code> \u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 <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 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 (<code>greet<\/code>) \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>c<\/code>. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a Go \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a <code>greet<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435.<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e <code>main<\/code> \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c <code>&quot;main() stopped&quot;<\/code>.<\/li>\n<\/ol>\n<p>  <\/p>\n<h2 id=\"deadlock-vzaimnaya-blokirovka\">Deadlock (\u0412\u0437\u0430\u0438\u043c\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430)<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0440\u0430\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0430\u043d\u0430\u043b \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442, \u043b\u0438\u0431\u043e \u043e\u043d\u0438 \u0432\u0441\u0435 &quot;\u0441\u043f\u044f\u0442&quot;. \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 deadlock, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e\u043c\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0435\u0441\u044c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u043d\u043e \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435, \u0447\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430.<\/p><\/blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043e\u043c deadlock \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>main<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043a\u0430\u043d\u0430\u043b\u043e\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func main() {     fmt.Println(&quot;main() started&quot;)      c := make(chan string)     c &lt;- &quot;John&quot;      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/2KTEoljdci_f\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0448\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]: main.main()         program.go:10 +0xfd exit status 2<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"zakrytie-kanala\">\u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430<\/h3>\n<p>  <\/p>\n<p>\u0412 Go \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u043d\u0430\u043b, \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0413\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u0442 \u043a\u0430\u043d\u0430\u043b \u0438\u043b\u0438 \u043d\u0435\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e: <code>val, ok := &lt;- channel<\/code>, \u0433\u0434\u0435 ok \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u0442\u0438\u043d\u043e\u0439 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043a\u0430\u043d\u0430\u043b \u043e\u0442\u043a\u0440\u044b\u0442 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 <code>ok<\/code> \u0431\u0443\u0434\u0435\u0442 <code>false<\/code>, \u0435\u0441\u043b\u0438 \u043a\u0430\u043d\u0430\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u043d\u0435\u0433\u043e. \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u043a\u0430\u043d\u0430\u043b \u043c\u043e\u0436\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>close<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>close(channel)<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func greet(c chan string) {     &lt;-c \/\/ for John     &lt;-c \/\/ for Mike }  func main() {     fmt.Println(&quot;main() started&quot;)      c := make(chan string, 1)      go greet(c)     c &lt;- &quot;John&quot;      close(c) \/\/ closing channel      c &lt;- &quot;Mike&quot;     fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/LMmAq4sgm02\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<blockquote><p>\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 <code>c &lt;- &quot;John&quot;<\/code> \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0439, \u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e <code>greet<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c. \u0417\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0432\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 <code>c<\/code>. \u0412\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 <code>c<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043d\u0430 <code>main<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 <code>close(c)<\/code>.<\/p><\/blockquote>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started panic: send on closed channel  goroutine 1 [running]: main.main()     program.go:20 +0x120 exit status 2<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430. \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0446\u0438\u043a\u043b\u043e\u043c <code>for<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"primer-s-ciklom-for\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0446\u0438\u043a\u043b\u043e\u043c for<\/h3>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func squares(c chan int) {     for i := 0; i &lt;= 9; i++ {         c &lt;- i * i     }      close(c) \/\/ close channel }  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan int)      go squares(c) \/\/ start goroutine      \/\/ periodic block\/unblock of main goroutine until chanel closes     for {         val, ok := &lt;-c         if ok == false {             fmt.Println(val, ok, &quot;&lt;-- loop broke!&quot;)             break \/\/ exit break loop         } else {             fmt.Println(val, ok)         }     }      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/X58FTgSHhXi\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 <code>squares<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u044b \u0447\u0438\u0441\u0435\u043b \u043e\u0442 0 \u0434\u043e 9. \u0412 <code>main<\/code> \u043c\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u0447\u0438\u0441\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430 <code>for<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0446\u0438\u043a\u043b\u0435 \u043c\u044b \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>val, ok := &lt;-c<\/code>, \u0433\u0434\u0435 <code>ok<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u0437\u0430\u043a\u0440\u044b\u0442. \u0412 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 <code>squares<\/code> \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043c\u044b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>close<\/code>. \u041a\u043e\u0433\u0434\u0430 <code>ok<\/code> \u0431\u0443\u0434\u0435\u0442 <code>true<\/code>, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>val<\/code> \u0438 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u0430\u043d\u0430\u043b\u0430 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>ok<\/code>). \u041a\u043e\u0433\u0434\u0430 <code>ok<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 <code>false<\/code>, \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043c \u0446\u0438\u043a\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>break<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0 true 1 true 4 true 9 true 16 true 25 true 36 true 49 true 64 true 81 true 0 false &lt;-- loop broke! main() stopped<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u041a\u043e\u0433\u0434\u0430 \u043a\u0430\u043d\u0430\u043b \u0437\u0430\u043a\u0440\u044b\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>val<\/code>, \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u043e\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430 <code>int<\/code>, \u0442\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 0, \u043a\u0430\u043a \u0440\u0430\u0437 \u044d\u0442\u043e \u043c\u044b \u0438 \u0432\u0438\u0434\u0438\u043c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435: <code>0 false &lt;-- loop broke!<\/code><\/p><\/blockquote>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u044c \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0446\u0438\u043a\u043b\u0430 <code>for<\/code>, Go \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>range<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0446\u0438\u043a\u043b, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043d\u0430\u043b \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>range<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func squares(c chan int) {     for i := 0; i &lt;= 9; i++ {         c &lt;- i * i     }      close(c) \/\/ close channel }  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan int)      go squares(c) \/\/ start goroutine      \/\/ periodic block\/unblock of main goroutine until chanel closes     for val := range c {         fmt.Println(val)     }      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/ICCYbWO7ZvD\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <code>val := range c<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u0433\u0434\u0435 <code>range<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0 1 4 9 16 25 36 49 64 81 main() stopped<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0435 \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0446\u0438\u043a\u043b\u0430 <code>for<\/code> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>range<\/code>, \u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e \u0438\u0437-\u0437\u0430 <code>dealock<\/code> \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"razmer-bufera-kanala\">\u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u0430<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0430\u043d\u0430\u043b \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443. \u041d\u043e \u043c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>make<\/code> \u0441 2-\u043c\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0412\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u0430. \u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0, \u0442\u0430\u043a\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0432 \u043a\u0430\u043d\u0430\u043b, \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 0, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d. \u041a\u043e\u0433\u0434\u0430 \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u043b\u044e\u0431\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043d\u0430\u043b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a \u0431\u0443\u0444\u0435\u0440\u0443, \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f (\u0433\u0434\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430). \u041d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0432\u043e\u0445, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0430 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0436\u0430\u0434\u043d\u043e\u0439, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c, \u043e\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043e\u043f\u0443\u0441\u0442\u043e\u0448\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u043d\u0430\u043b\u0430 \u0431\u0435\u0437 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0443\u0441\u0442\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">c := make(chan Type, n)<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043a\u0430\u043d\u0430\u043b \u0441 \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 <code>Type<\/code> \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0430 <code>n<\/code>. \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u043f\u043e\u043a\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e n+1 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func squares(c chan int) {     for i := 0; i &lt;= 3; i++ {         num := &lt;-c         fmt.Println(num * num)     } }  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan int, 3)      go squares(c)      c &lt;- 1     c &lt;- 2     c &lt;- 3      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/k0usdYZfp3D\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u0430\u043d\u0430\u043b <code>c<\/code> \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0440\u0430\u0432\u043d\u044b\u043c 3. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c 3 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f(<code>c &lt;- 3<\/code>), \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (\u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440), <code>main<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0431\u0435\u0437 \u0432\u044b\u0432\u043e\u0434\u0430 \u0447\u0438\u0441\u0435\u043b. \u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started main() stopped<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func squares(c chan int) {     for i := 0; i &lt;= 3; i++ {         num := &lt;-c         fmt.Println(num * num)     } }  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan int, 3)      go squares(c)      c &lt;- 1     c &lt;- 2     c &lt;- 3     c &lt;- 4 \/\/ blocks here      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/KGyiskRj1Wi\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0438 <code>main<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0437\u0430\u0442\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 <code>squares<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430, \u043f\u043e\u043a\u0430 \u043e\u043d \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0443\u0441\u0442\u044b\u043c.<\/p>\n<p>  <\/p>\n<h2 id=\"dlina-i-emkost-kanala\">\u0414\u043b\u0438\u043d\u0430 \u0438 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u0430<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u043e \u0441\u0440\u0435\u0437\u0430\u043c, \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0438\u043c\u0435\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u0438 \u0435\u043c\u043a\u043e\u0441\u0442\u044c. \u0414\u043b\u0438\u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445) \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u0430\u043d\u0430\u043b\u0430, \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u0430. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>len<\/code>, \u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>cap<\/code>, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">package main  import &quot;fmt&quot;  func main() {     c := make(chan int, 3)     c &lt;- 1     c &lt;- 2      fmt.Printf(&quot;Length of channel c is %v and capacity of channel c is %v&quot;, len(c), cap(c))     fmt.Println() } <\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/qsDZu6pXLT7\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Length of channel c is 2 and capacity of channel c is 3<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438 <code>deadlock<\/code> \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 3, \u0430 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e 2 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0431\u0443\u0444\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0438 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b <code>main<\/code>. \u0412\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 <code>main<\/code>, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <strong>\u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func sender(c chan int) {     c &lt;- 1 \/\/ len 1, cap 3     c &lt;- 2 \/\/ len 2, cap 3     c &lt;- 3 \/\/ len 3, cap 3     c &lt;- 4 \/\/ &lt;- goroutine blocks here     close(c) }  func main() {     c := make(chan int, 3)      go sender(c)      fmt.Printf(&quot;Length of channel c is %v and capacity of channel c is %v\\n&quot;, len(c), cap(c))      \/\/ read values from c (blocked here)     for val := range c {         fmt.Printf(&quot;Length of channel c after value '%v' read is %v\\n&quot;, val, len(c))     } }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/-gGpm08-wzz\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Length of channel c is 0 and capacity of channel c is 3 Length of channel c after value '1' read is 3 Length of channel c after value '2' read is 2 Length of channel c after value '3' read is 1 Length of channel c after value '4' read is 0<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;runtime&quot; )  func squares(c chan int) {     for i := 0; i &lt; 4; i++ {         num := &lt;-c         fmt.Println(num * num)     } }  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan int, 3)     go squares(c)      fmt.Println(&quot;active goroutines&quot;, runtime.NumGoroutine())     c &lt;- 1     c &lt;- 2     c &lt;- 3     c &lt;- 4 \/\/ blocks here      fmt.Println(&quot;active goroutines&quot;, runtime.NumGoroutine())      go squares(c)      fmt.Println(&quot;active goroutines&quot;, runtime.NumGoroutine())      c &lt;- 5     c &lt;- 6     c &lt;- 7     c &lt;- 8 \/\/ blocks here      fmt.Println(&quot;active goroutines&quot;, runtime.NumGoroutine())     fmt.Println(&quot;main() stopped&quot;) } <\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/sdHPDx64aor\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started active goroutines 2 1 4 9 16 active goroutines 1 active goroutines 2 25 36 49 64 active goroutines 1 main() stopped <\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0438 \u0446\u0438\u043a\u043b <code>for range<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0436\u0438\u0432\u0443\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func main() {     c := make(chan int, 3)     c &lt;- 1     c &lt;- 2     c &lt;- 3     close(c)      \/\/ iteration terminates after receiving 3 values     for elem := range c {         fmt.Println(elem)     } }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/vULFyWnpUoj\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<h2 id=\"rabota-s-neskolkimi-gorutinami\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438<\/h2>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c 2 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043e\u0434\u043d\u0430 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u0443\u0431\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func square(c chan int) {     fmt.Println(&quot;[square] reading&quot;)     num := &lt;-c     c &lt;- num * num }  func cube(c chan int) {     fmt.Println(&quot;[cube] reading&quot;)     num := &lt;-c     c &lt;- num * num * num }  func main() {     fmt.Println(&quot;[main] main() started&quot;)      squareChan := make(chan int)     cubeChan := make(chan int)      go square(squareChan)     go cube(cubeChan)      testNum := 3     fmt.Println(&quot;[main] sent testNum to squareChan&quot;)      squareChan &lt;- testNum      fmt.Println(&quot;[main] resuming&quot;)     fmt.Println(&quot;[main] sent testNum to cubeChan&quot;)      cubeChan &lt;- testNum      fmt.Println(&quot;[main] resuming&quot;)     fmt.Println(&quot;[main] reading from channels&quot;)      squareVal, cubeVal := &lt;-squareChan, &lt;-cubeChan     sum := squareVal + cubeVal      fmt.Println(&quot;[main] sum of square and cube of&quot;, testNum, &quot; is&quot;, sum)     fmt.Println(&quot;[main] main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/6wdhWYpRfrX\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u043e \u0448\u0430\u0433\u0430\u043c:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 2 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>square<\/code> \u0438 <code>cube<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u0430\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u041e\u0431\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043a\u0430\u043d\u0430\u043b <code>c<\/code> c \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 <code>int<\/code>, \u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>num<\/code>. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b <code>c<\/code>.<\/li>\n<li>\u0412 <code>main<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 <code>squareChan<\/code> \u0438 <code>cubeChan<\/code> c \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 <code>int<\/code>.<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>square<\/code> \u0438 <code>cube<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b.<\/li>\n<li>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 <code>main<\/code> <code>testNum<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3.<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b <code>squareChan<\/code> \u0438 <code>cubeChan<\/code>. \u0413\u043e\u0440\u0443\u0442\u0438\u043d\u0430 <code>main<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u043f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u043d\u044b. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u043d\u043e, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439.<\/li>\n<li>\u041a\u043e\u0433\u0434\u0430 \u0432 <code>main<\/code> \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432(<code>squareChan<\/code> \u0438 <code>cubeChan<\/code>), \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043f\u043e\u043a\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b (<code>square<\/code> \u0438 <code>cube<\/code>) \u043d\u0435 \u0437\u0430\u043f\u0438\u0448\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u0438 \u043a\u0430\u043d\u0430\u043b\u044b. \u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>:=<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432.<\/li>\n<li>\u041a\u043e\u0433\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u0430\u043d\u0430\u043b\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f <code>main<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0435\u0435.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[main] main() started [main] sent testNum to squareChan [cube] reading [square] reading [main] resuming [main] sent testNum to cubeChan [main] resuming [main] reading from channels [main] sum of square and cube of 3  is 36 [main] main() stopped<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"odnonapravlennye-kanaly\">\u041e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b<\/h3>\n<p>  <\/p>\n<p>\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043a\u0430\u043d\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u043e \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u043a\u0430\u043d\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0445.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>make<\/code>, \u043d\u043e \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">roc := make(&lt;-chan int) soc := make(chan&lt;- int)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u0434\u0435 <code>roc<\/code> \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0430 <code>soc<\/code> \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u043d\u0430\u043b\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 \u0442\u0438\u043f.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func main() {     roc := make(&lt;-chan int)     soc := make(chan&lt;- int)      fmt.Printf(&quot;Data type of roc is `%T`\\n&quot;, roc)     fmt.Printf(&quot;Data type of soc is `%T\\n&quot;, soc) } <\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/JZO51IoaMg8\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Data type of roc is `&lt;-chan int` Data type of soc is `chan&lt;- int<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0432 \u0447\u0435\u043c \u0441\u043c\u044b\u0441\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430? \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043ce, \u0447\u0442\u043e, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\/\u0432 \u0442\u043e\u0442 \u0436\u0435 \u043a\u0430\u043d\u0430\u043b. \u041a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c?<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e Go \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0432 \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">import &quot;fmt&quot;  func greet(roc &lt;-chan string) {     fmt.Println(&quot;Hello &quot; + &lt;-roc + &quot;!&quot;) }  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan string)      go greet(c)      c &lt;- &quot;John&quot;     fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/k3B3gCelrGv\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>greet<\/code> \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0430 \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430, \u0430 \u043b\u044e\u0431\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e\u043c\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<p><code>&quot;invalid operation: roc &lt;- &quot;some text&quot; (send to receive-only type &lt;-chan string)&quot;<\/code><\/p>\n<p>  <\/p>\n<h3 id=\"anonimnye-gorutiny\">\u0410\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043d\u0430\u043b\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u043c\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b.<br \/>  \u0412\u043e\u0442 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func main() {     fmt.Println(&quot;main() started&quot;)     c := make(chan string)      \/\/ launch anonymous goroutine     go func(c chan string) {         fmt.Println(&quot;Hello &quot; + &lt;-c + &quot;!&quot;)     }(c)      c &lt;- &quot;John&quot;     fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/cM5nFgRha7c\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439.<\/p>\n<p>  <\/p>\n<h3 id=\"kanal-s-tipom-dannyh-kanala\">\u041a\u0430\u043d\u0430\u043b \u0441 \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043d\u0430\u043b\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0\">\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/a>, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0438\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u043c\u0435\u0442\u043e\u0434\u0430 \u0438 \u0434\u0430\u0436\u0435 \u043a\u0430\u043a \u0442\u0438\u043f \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  \/\/ gets a channel and prints the greeting by reading from channel func greet(c chan string) {     fmt.Println(&quot;Hello &quot; + &lt;-c + &quot;!&quot;) }  \/\/ gets a channels and writes a channel to it func greeter(cc chan chan string) {     c := make(chan string)     cc &lt;- c }  func main() {     fmt.Println(&quot;main() started&quot;)      \/\/ make a channel `cc` of data type channel of string data type     cc := make(chan chan string)      go greeter(cc) \/\/ start `greeter` goroutine using `cc` channel      \/\/ receive a channel `c` from `greeter` goroutine     c := &lt;-cc      go greet(c) \/\/ start `greet` goroutine using `c` channel      \/\/ send data to `c` channel     c &lt;- &quot;John&quot;      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/xVQvvb8O4De\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<h3 id=\"select\">select<\/h3>\n<p>  <\/p>\n<p><code>select<\/code> \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 <code>switch<\/code> \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>select<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u043e\u043c case.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435, \u0438 \u043e\u0431\u0441\u0443\u0434\u0438\u043c \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  var start time.Time func init() {     start = time.Now() }  func service1(c chan string) {     time.Sleep(3 * time.Second)     c &lt;- &quot;Hello from service 1&quot; }  func service2(c chan string) {     time.Sleep(5 * time.Second)     c &lt;- &quot;Hello from service 2&quot; }  func main() {     fmt.Println(&quot;main() started&quot;, time.Since(start))      chan1 := make(chan string)     chan2 := make(chan string)      go service1(chan1)     go service2(chan2)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from service 1&quot;, res, time.Since(start))     case res := &lt;-chan2:         fmt.Println(&quot;Response from service 2&quot;, res, time.Since(start))     }      fmt.Println(&quot;main() stopped&quot;, time.Since(start)) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/ar5dZUQ2ArH\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>select<\/code> \u043a\u0430\u043a <code>switch<\/code>, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u0443\u043b\u0435\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>select<\/code> \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>default<\/code>(\u043f\u043e\u0437\u0436\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c). \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432 <code>case<\/code>, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 <code>main<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0417\u0430\u0434\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u043a\u043e\u0433\u0434\u0430 <code>case<\/code> \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f?<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 <code>case<\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438, \u0442\u043e\u0433\u0434\u0430 <code>select<\/code> \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432 <code>case<\/code> \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d. \u0415\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043b\u0438 \u0432\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b, \u0442\u043e\u0433\u0434\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u0445 <code>case<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430: \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0432\u0438\u0434\u0443 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u043d\u0430\u043b\u043e\u0432).<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435. \u041c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 2 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>select<\/code> c \u0434\u0432\u0443\u043c\u044f <code>case<\/code> \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438. \u041e\u0434\u0438\u043d <code>case<\/code> \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <code>chan1<\/code> \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0437 <code>chan2<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u043d\u0430\u043b\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u0443\u0444\u0435\u0440, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0430 <code>case<\/code> \u0431\u0443\u0434\u0443\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u0438 <code>select<\/code> \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 <code>case<\/code> \u043d\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0431\u043b\u043e\u043a\u0435 <code>select<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 <code>main<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b (\u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0437\u0430 \u0440\u0430\u0437), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0431\u043b\u043e\u043a\u0435 <code>select<\/code>, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <code>service1<\/code> \u0438 <code>service2<\/code>. <code>service1<\/code> \u0436\u0434\u0435\u0442 3 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 <code>chan1<\/code>. \u0422\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043a \u0438 <code>service1<\/code> \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 <code>service2<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u0442 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 <code>chan2<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a <code>service1<\/code> \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c <code>service2<\/code>, \u043f\u0435\u0440\u0432\u044b\u0439 <code>case<\/code> \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 <code>chan1<\/code>, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 <code>case<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0432 <code>main<\/code>, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s Response from service 1 Hello from service 1 3s main() stopped 3s<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0412\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0431. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043a\u0430\u043d\u0430\u043b\u044b \u0438 select, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0438 \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u0441\u0435\u0445, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d.<\/p><\/blockquote>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 <code>case<\/code> \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 Sleep \u0438\u0437 \u0433\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  var start time.Time func init() {     start = time.Now() }  func service1(c chan string) {     c &lt;- &quot;Hello from service 1&quot; }  func service2(c chan string) {     c &lt;- &quot;Hello from service 2&quot; }  func main() {     fmt.Println(&quot;main() started&quot;, time.Since(start))      chan1 := make(chan string)     chan2 := make(chan string)      go service1(chan1)     go service2(chan2)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from service 1&quot;, res, time.Since(start))     case res := &lt;-chan2:         fmt.Println(&quot;Response from service 2&quot;, res, time.Since(start))     }      fmt.Println(&quot;main() stopped&quot;, time.Since(start)) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/giSkkqt8XHb\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s service2() started 481\u00b5s Response from service 2 Hello from service 2 981.1\u00b5s main() stopped 981.1\u00b5s<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s service1() started 484.8\u00b5s Response from service 1 Hello from service 1 984\u00b5s main() stopped 984\u00b5s<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>chan1<\/code> \u0438 <code>chan2<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 <code>case<\/code> \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  var start time.Time  func init() {     start = time.Now() }  func main() {     fmt.Println(&quot;main() started&quot;, time.Since(start))     chan1 := make(chan string, 2)     chan2 := make(chan string, 2)      chan1 &lt;- &quot;Value 1&quot;     chan1 &lt;- &quot;Value 2&quot;     chan2 &lt;- &quot;Value 1&quot;     chan2 &lt;- &quot;Value 2&quot;      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from chan1&quot;, res, time.Since(start))     case res := &lt;-chan2:         fmt.Println(&quot;Response from chan2&quot;, res, time.Since(start))     }      fmt.Println(&quot;main() stopped&quot;, time.Since(start)) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/RLRGEmFQP3f\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s Response from chan2 Value 1 0s main() stopped 1.0012ms<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043b\u0438 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s Response from chan1 Value 1 0s main() stopped 1.0012ms<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u0431\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 \u0438\u043c\u0435\u044e\u0442 \u0431\u0443\u0444\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 2. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c 2 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0431\u0443\u0444\u0435\u0440, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 \u0431\u043b\u043e\u043a <code>select<\/code>. \u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u0435\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 <code>case<\/code> \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438, \u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Go \u0432\u044b\u0431\u0435\u0440\u0435\u0442 <code>case<\/code> \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"default-case\">default case<\/h3>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 <code>switch<\/code>, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>select<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>default<\/code>. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>default<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c, \u043d\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>default<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u043b\u043e\u043a <code>select<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u0435 (\u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043a\u0430\u043d\u0430\u043b \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0438\u043b\u0438 \u0431\u0435\u0437) \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043b\u0438\u0431\u043e \u043a\u0430\u043d\u0430\u043b\u0435, \u0442\u043e <code>select<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u044d\u0442\u043e\u0442 <code>case<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043e\u043d \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 <code>default<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  var start time.Time  func init() {     start = time.Now() }  func service1(c chan string) {     fmt.Println(&quot;service1() started&quot;, time.Since(start))     c &lt;- &quot;Hello from service 1&quot; }  func service2(c chan string) {     fmt.Println(&quot;service2() started&quot;, time.Since(start))     c &lt;- &quot;Hello from service 2&quot; }  func main() {     fmt.Println(&quot;main() started&quot;, time.Since(start))      chan1 := make(chan string)     chan2 := make(chan string)      go service1(chan1)     go service2(chan2)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from service 1&quot;, res, time.Since(start))     case res := &lt;-chan2:         fmt.Println(&quot;Response from service 2&quot;, res, time.Since(start))     default:         fmt.Println(&quot;No response received&quot;, time.Since(start))     }      fmt.Println(&quot;main() stopped&quot;, time.Since(start)) } <\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/rFMpc80EuT3\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s No response received 0s main() stopped 0s<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0431\u0443\u0444\u0435\u0440\u0430, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0435\u0449\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432 \u043e\u0431\u043e\u0438\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d <code>default<\/code>. \u0415\u0441\u043b\u0438 \u0431\u044b \u0432 \u0431\u043b\u043e\u043a\u0435 <code>select<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b <code>default<\/code>, \u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0431\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u044b\u043b \u0431\u044b \u0434\u0440\u0443\u0433\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441 <code>default<\/code> <code>select<\/code> \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u041d\u043e <code>main<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0432\u044b\u0437\u0432\u0430\u0432 <code>time.Sleep<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u0438 \u043a\u043e\u0433\u0434\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 <code>main<\/code>, \u043a\u0430\u043d\u0430\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  var start time.Time  func init() {     start = time.Now() }  func service1(c chan string) {     fmt.Println(&quot;service1() started&quot;, time.Since(start))     c &lt;- &quot;Hello from service 1&quot; }  func service2(c chan string) {     fmt.Println(&quot;service2() started&quot;, time.Since(start))     c &lt;- &quot;Hello from service 2&quot; }  func main() {     fmt.Println(&quot;main() started&quot;, time.Since(start))      chan1 := make(chan string)     chan2 := make(chan string)      go service1(chan1)     go service2(chan2)      time.Sleep(3 * time.Second)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from service 1&quot;, res, time.Since(start))     case res := &lt;-chan2:         fmt.Println(&quot;Response from service 2&quot;, res, time.Since(start))     default:         fmt.Println(&quot;No response received&quot;, time.Since(start))     }      fmt.Println(&quot;main() stopped&quot;, time.Since(start)) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/eD0NHxHm9hN\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s service1() started 0s service2() started 0s Response from service 1 Hello from service 1 3.0001805s main() stopped 3.0001805s<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043b\u0438 \u0442\u0430\u043a\u043e\u0439, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s service1() started 0s service2() started 0s Response from service 2 Hello from service 2 3.0000957s main() stopped 3.0000957s<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"deadlock\">Deadlock<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c <code>deadlock<\/code>, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>default<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a Go \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0430\u043d\u0430\u043b, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  var start time.Time  func init() {     start = time.Now() }  func main() {     fmt.Println(&quot;main() started&quot;, time.Since(start))      chan1 := make(chan string)     chan2 := make(chan string)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from chan1&quot;, res, time.Since(start))     case res := &lt;-chan2:         fmt.Println(&quot;Response from chan2&quot;, res, time.Since(start))     default:         fmt.Println(&quot;No goroutines available to send data&quot;, time.Since(start))     }      fmt.Println(&quot;main() stopped&quot;, time.Since(start)) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/S3Wxuqb8lMF\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s No goroutines available to send data 0s main() stopped 0s<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>default<\/code>, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f).<\/p>\n<p>  <\/p>\n<h3 id=\"nil-kanaly\">nil \u043a\u0430\u043d\u0430\u043b\u044b<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u043d\u0430\u043b\u0430 \u2014 \u044d\u0442\u043e <code>nil<\/code>, \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438\u043b\u0438 \u043f\u0440\u0438\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b \u0432 \u0431\u043b\u043e\u043a\u0435 <code>select<\/code>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func service(c chan string) {     c &lt;- &quot;response&quot; }  func main() {     fmt.Println(&quot;main() started&quot;)      var chan1 chan string      go service(chan1)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from chan1&quot;, res)     }      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/uhraFubcF4S\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started fatal error: all goroutines are asleep - deadlock!  goroutine 1 [select (no cases)]: main.main()     program.go:17 +0xc0  goroutine 6 [chan send (nil chan)]: main.service(0x0, 0x1)     program.go:6 +0x40 created by main.main     program.go:14 +0xa0<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e <code>select (no cases)<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e <code>select<\/code> \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0443\u0441\u0442\u043e\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>case<\/code> \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u043c \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u043e\u0439 <code>select{}<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 <code>main<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 <code>service<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 <code>nil<\/code> \u043a\u0430\u043d\u0430\u043b, \u0447\u0442\u043e \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e\u043c\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439: <code>chan send (nil chan)<\/code>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>default<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func service(c chan string) {     c &lt;- &quot;response&quot; }  func main() {     fmt.Println(&quot;main() started&quot;)      var chan1 chan string      go service(chan1)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from chan1&quot;, res)     default:         fmt.Println(&quot;No response&quot;)     }      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/upLsz52_CrE\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started No response main() stopped<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0431\u043b\u043e\u043a\u0438 <code>case<\/code> \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u043b\u043e\u043a <code>default<\/code> \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 <code>service<\/code>. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u043d\u0435 <code>nil<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"dobavlyaem-timeout\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c timeout<\/h3>\n<p>  <\/p>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u043b\u043e\u043a <code>default<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435. \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u0437\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442, \u0442\u043e\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0431\u043b\u043e\u043a <code>default<\/code>. \u042d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>case<\/code> \u0441 \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0422\u0430\u043a\u0430\u044f \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>After<\/code> \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 (package) <code>time<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  var start time.Time  func init() {     start = time.Now() }  func service1(c chan string) {     time.Sleep(3 * time.Second)     c &lt;- &quot;Hello from service 1&quot; }  func service2(c chan string) {     time.Sleep(5 * time.Second)     c &lt;- &quot;Hello from service 2&quot; }  func main() {     fmt.Println(&quot;main() started&quot;, time.Since(start))      chan1 := make(chan string)     chan2 := make(chan string)      go service1(chan1)     go service2(chan2)      select {     case res := &lt;-chan1:         fmt.Println(&quot;Response from service 1&quot;, res, time.Since(start))     case res := &lt;-chan2:         fmt.Println(&quot;Response from service 2&quot;, res, time.Since(start))     case &lt;-time.After(2 * time.Second):         fmt.Println(&quot;No response received&quot;, time.Since(start))     }      fmt.Println(&quot;main() stopped&quot;, time.Since(start)) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/mda2t2IQK__X\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0434\u0430\u0441\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started 0s No response received 2s main() stopped 2s<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>&lt;-time.After(2 * time.Second)<\/code> \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 <code>main<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. <code>time.After<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u0430\u043d\u0430\u043b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 <code>chan1<\/code> \u0438 <code>chan2<\/code> \u043d\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f 3-\u0439 \u0431\u043b\u043e\u043a, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0436\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0415\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c <code>time.After(2 * time.Second)<\/code> \u043d\u0430 <code>time.After(2 * time.Second)<\/code> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437 <code>service1<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"pustoy-select\">\u041f\u0443\u0441\u0442\u043e\u0439 select<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u043e \u043f\u0443\u0441\u0442\u043e\u043c\u0443 <code>for{}<\/code>, \u043f\u0443\u0441\u0442\u043e\u0439 <code>select{}<\/code> \u0442\u0430\u043a \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0445. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c <code>select<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432 <code>case<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d, \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0443\u0441\u0442\u043e\u043c <code>select<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0431\u043b\u043e\u043a\u0438 <code>case<\/code>, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0438 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>deadlock<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  func service() {     fmt.Println(&quot;Hello from service!&quot;) }  func main() {     fmt.Println(&quot;main() started&quot;)      go service()      select {}      fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/-pBd-BLMFOu\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started Hello from service! fatal error: all goroutines are asleep - deadlock! goroutine 1 [select (no cases)]: main.main()         program.go:16 +0xba exit status 2<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"waitgroup\">WaitGroup<\/h3>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0430\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445). \u0422\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0441 <code>select<\/code>. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 WaitGroup. \u042d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0432\u0430\u043c\u0438 \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e, \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043d\u0438\u0445 \u0431\u044b\u043b\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430: \u0441\u0430\u043c\u0430 \u043e\u043d\u0430 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u043d\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0432\u0430\u043c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0433\u043e, \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0438, \u043a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432). \u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c \u043d\u0443\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;sync&quot;     &quot;time&quot; )  func service(wg *sync.WaitGroup, instance int) {     time.Sleep(2 * time.Second)     fmt.Println(&quot;Service called on instance&quot;, instance)     wg.Done() \/\/ decrement counter }  func main() {     fmt.Println(&quot;main() started&quot;)     var wg sync.WaitGroup \/\/ create waitgroup (empty struct)      for i := 1; i &lt;= 3; i++ {         wg.Add(1) \/\/ increment counter         go service(&amp;wg, i)     }      wg.Wait() \/\/ blocks here     fmt.Println(&quot;main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/8qrAD9ceOfJ\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 WaitGroup, \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f <code>noCopy<\/code> \u0438 <code>state1<\/code> (<a href=\"https:\/\/golang.org\/src\/sync\/waitgroup.go?s=574:929#L10\">https:\/\/golang.org\/src\/sync\/waitgroup.go?s=574:929#L10<\/a>). \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430: <code>Add<\/code>, <code>Wait<\/code> \u0438 <code>Done<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>Add<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>int<\/code> \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>delta<\/code> (\u0434\u0435\u043b\u044c\u0442\u043e\u0439) \u0434\u043b\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 <code>WaitGroup<\/code>. \u0413\u0434\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0432\u043d\u044b\u043c 0. \u041e\u043d \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u041a\u043e\u0433\u0434\u0430 <code>WaitGroup<\/code> \u0441\u043e\u0437\u0434\u0430\u043d\u0430, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 0, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f <code>delta<\/code> \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Add<\/code>. \u0421\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>Add<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>Wait<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0442 0, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0430\u043a-\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430.<\/p>\n<p>  <\/p>\n<h2>\u041c\u0435\u0442\u043e\u0434 <code>Done<\/code> \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430. \u041e\u043d \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. (\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430: \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>sync<\/code>, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/golang.org\/src\/sync\/waitgroup.go?s=574:929#L98\">Add(-1)<\/a>).<\/h2>\n<p>  <\/p>\n<h2>\u0418 \u0442\u0430\u043a, \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>wg<\/code>, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0432 \u0446\u0438\u043a\u043b\u0435 <code>for<\/code> \u043e\u0442 1 \u0434\u043e 3\u0445 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0430 1. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 3 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438 <code>WaitGroup<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0440\u0430\u0432\u043d\u044b\u043c 3. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>wg<\/code> \u0432 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>Done<\/code> \u0432 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u0447\u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430.<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 <code>for<\/code>, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>wg.Wait()<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c, \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u044d\u0442\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0448 <code>main<\/code> \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 0. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e <code>main<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">main() started Service called on instance 1 Service called on instance 3 Service called on instance 2 main() stopped<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0438\u0437-\u0437\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>  <\/p>\n<h3 id=\"pul-vorkerov\">\u041f\u0443\u043b \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043f\u0443\u043b \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>WaitGroup<\/code> \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043d\u043e \u0443 \u043d\u0438\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0432 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u0443 \u043d\u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430, \u0438 \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0443\u043b\u043e\u043c \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  \/\/ worker than make squares func sqrWorker(tasks &lt;-chan int, results chan&lt;- int, id int) {     for num := range tasks {         time.Sleep(time.Millisecond) \/\/ simulating blocking task         fmt.Printf(&quot;[worker %v] Sending result by worker %v\\n&quot;, id, id)         results &lt;- num * num     } }  func main() {     fmt.Println(&quot;[main] main() started&quot;)      tasks := make(chan int, 10)     results := make(chan int, 10)      \/\/ launching 3 worker goroutines     for i := 0; i &lt; 3; i++ {         go sqrWorker(tasks, results, i)     }      \/\/ passing 5 tasks     for i := 0; i &lt; 5; i++ {         tasks &lt;- i * 2 \/\/ non-blocking as buffer capacity is 10     }      fmt.Println(&quot;[main] Wrote 5 tasks&quot;)      \/\/ closing tasks     close(tasks)      \/\/ receving results from all workers     for i := 0; i &lt; 5; i++ {         result := &lt;-results \/\/ blocking because buffer is empty         fmt.Println(&quot;[main] Result&quot;, i, &quot;:&quot;, result)     }      fmt.Println(&quot;[main] main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/IYiMV1I4lCj\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[main] main() started [main] Wrote 5 tasks [worker 0] Sending result by worker 0 [worker 2] Sending result by worker 2 [worker 1] Sending result by worker 1 [main] Result 0 : 4 [main] Result 1 : 0 [main] Result 2 : 16 [worker 2] Sending result by worker 2 [main] Result 3 : 64 [worker 0] Sending result by worker 0 [main] Result 4 : 36 [main] main() stopped<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>sqrWorker<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b <code>tasks<\/code>, \u043a\u0430\u043d\u0430\u043b <code>results<\/code>, \u0430 \u0442\u0430\u043a \u0436\u0435 <code>id<\/code>. \u0417\u0430\u0434\u0430\u0447\u0430 \u044d\u0442\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0447\u0438\u0441\u043b\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>tasks<\/code>, \u0432 \u043a\u0430\u043d\u0430\u043b <code>results<\/code>.<\/li>\n<li>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>main<\/code>, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u0430\u043d\u0430\u043b\u044b <code>tasks<\/code> \u0438 <code>result<\/code> \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0430, \u0440\u0430\u0432\u043d\u043e\u0439 10. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u043f\u043e\u043a\u0430 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u043d\u0430\u043b \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u2014 \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f.<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 <code>sqrWorker<\/code> \u0432 \u0432\u0438\u0434\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0441 \u0434\u0432\u0443\u043c\u044f \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>id<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443.<\/li>\n<li>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 5 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u0430\u043d\u0430\u043b\u0443 <code>tasks<\/code>, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d.<\/li>\n<li>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0441 \u043a\u0430\u043d\u0430\u043b\u043e\u043c <code>tasks<\/code>, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e \u044d\u0442\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0435\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0438.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0446\u0438\u043a\u043b <code>for<\/code> \u0441 5\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u043c\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>results<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0438\u0437 \u043f\u0443\u043b\u0430 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432. \u0414\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0432\u0435\u0440\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, <code>main<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d.<\/li>\n<li>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435, \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f, \u043e\u043d\u0430 \u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u0430\u043d\u0430\u043b <code>results<\/code>, \u0430 \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043a\u0430\u043d\u0430\u043b \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u044b\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0431\u0443\u0444\u0435\u0440 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f, \u0437\u0430\u043f\u0443\u0441\u0442\u044f\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>tasks<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <code>tasks<\/code>, \u0446\u0438\u043a\u043b <code>for<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f, \u0430 \u043a\u0430\u043d\u0430\u043b <code>tasks<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442\u044b\u043c. \u0422\u0430\u043a \u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 <code>deadlock<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u043d\u0430\u043b <code>tasks<\/code> \u0431\u044b\u043b \u0437\u0430\u043a\u0440\u044b\u0442.<\/li>\n<li>\u0418\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>main<\/code> \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043a\u0430\u043d\u0430\u043b <code>results<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442.<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, <code>main<\/code> \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>results<\/code>, \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u043a\u0430\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u0413\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432\u0435\u0441\u044c\u043c\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0415\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432 <code>time.Sleep()<\/code>, \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0440\u0443\u0433\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0446\u0438\u043a\u043b \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p><\/blockquote>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 <code>WaitGroup<\/code> \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <code>WaitGroup<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;sync&quot;     &quot;time&quot; )  \/\/ worker than make squares func sqrWorker(wg *sync.WaitGroup, tasks &lt;-chan int, results chan&lt;- int, instance int) {     for num := range tasks {         time.Sleep(time.Millisecond)         fmt.Printf(&quot;[worker %v] Sending result by worker %v\\n&quot;, instance, instance)         results &lt;- num * num     }      \/\/ done with worker     wg.Done() }  func main() {     fmt.Println(&quot;[main] main() started&quot;)      var wg sync.WaitGroup      tasks := make(chan int, 10)     results := make(chan int, 10)      \/\/ launching 3 worker goroutines     for i := 0; i &lt; 3; i++ {         wg.Add(1)         go sqrWorker(&amp;wg, tasks, results, i)     }      \/\/ passing 5 tasks     for i := 0; i &lt; 5; i++ {         tasks &lt;- i * 2 \/\/ non-blocking as buffer capacity is 10     }      fmt.Println(&quot;[main] Wrote 5 tasks&quot;)      \/\/ closing tasks     close(tasks)      \/\/ wait until all workers done their job     wg.Wait()      \/\/ receving results from all workers     for i := 0; i &lt; 5; i++ {         result := &lt;-results \/\/ non-blocking because buffer is non-empty         fmt.Println(&quot;[main] Result&quot;, i, &quot;:&quot;, result)     }      fmt.Println(&quot;[main] main() stopped&quot;) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/0rRfchn7sL1\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[main] main() started [main] Wrote 5 tasks [worker 0] Sending result by worker 0 [worker 2] Sending result by worker 2 [worker 1] Sending result by worker 1 [worker 2] Sending result by worker 2 [worker 0] Sending result by worker 0 [main] Result 0 : 4 [main] Result 1 : 0 [main] Result 2 : 16 [main] Result 3 : 64 [main] Result 4 : 36 [main] main() stopped<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439, \u0431\u043e\u043b\u0435\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>results<\/code> \u0432 <code>main<\/code> \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u043d\u0430\u043b <code>results<\/code> \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437-\u0437\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 <code>wg.Wait()<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>WaitGroup<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e (\u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445) \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 (\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0438 \u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a), \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 7 \u043f\u0440\u043e\u0442\u0438\u0432 9 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<p>  <\/p>\n<h3 id=\"myuteks\">\u041c\u044c\u044e\u0442\u0435\u043a\u0441<\/h3>\n<p>  <\/p>\n<p>\u041c\u044c\u044e\u0442\u0435\u043a\u0441 \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 \u0432 Go. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0432 \u043f\u043e\u043d\u044f\u0442\u0438\u0438 <code>race condition<\/code>(<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8\">\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0433\u043e\u043d\u043a\u0438<\/a>). \u0413\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0441\u0442\u0435\u043a, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043e\u0431\u043c\u0435\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041d\u043e, \u0438\u043d\u043e\u0433\u0434\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043e\u0431\u0449\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;sync&quot; )  var i int \/\/ i == 0  \/\/ goroutine increment global variable i func worker(wg *sync.WaitGroup) {     i = i + 1     wg.Done() }  func main() {     var wg sync.WaitGroup      for i := 0; i &lt; 1000; i++ {         wg.Add(1)         go worker(&amp;wg)     }      \/\/ wait until all 1000 goroutines are done     wg.Wait()      \/\/ value of i should be 1000     fmt.Println(&quot;value of i after 1000 operations is&quot;, i) }<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/play.golang.org\/p\/MQNepChxiEa\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 play.golang.org<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c 1000 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>i<\/code>, \u0440\u0430\u0432\u043d\u043e\u0439 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e 0. \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>WaitGroup<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 1000 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0432\u043d\u043e 1000. \u041a\u043e\u0433\u0434\u0430 <code>main<\/code> \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>wg.Wait()<\/code>, \u043c\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">value of i after 1000 operations is 937<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e? \u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 1000? \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0447\u0430\u0441\u0442\u044c \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u041d\u043e, \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e <code>race condition<\/code>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code>i = i + 1<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code><\/li>\n<li>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043d\u0430 1<\/li>\n<li>\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u0441 \u043d\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0448\u0430\u0433\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c 2 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438\u0437 \u043f\u0443\u043b\u0430 1000 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e. G1 \u0438 G2.<\/p>\n<p>  <\/p>\n<p>G1 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 <code>i<\/code> \u0440\u0430\u0432\u043d\u0430 0, \u043f\u043e\u0441\u043b\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0448\u0430\u0433\u0430 <code>i<\/code> \u0441\u0442\u0430\u043b\u0430 \u0440\u0430\u0432\u043d\u043e\u0439 1. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a G1 \u0438\u0437\u043c\u0435\u043d\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u043d\u0430 1 \u0432 \u0448\u0430\u0433\u0435 3, \u043d\u043e\u0432\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 G2 \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0438 \u044d\u0442\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0442\u0435 \u0436\u0435 \u0448\u0430\u0433\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 G2, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u0432\u0441\u0435 \u0435\u0449\u0435 0, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0448\u0430\u0433\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 1, \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f G1 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c \u0442\u0440\u0435\u0442\u0438\u0439 \u0448\u0430\u0433 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u043d\u0430 1. \u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435, \u0433\u0434\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 3-\u0445 \u0448\u0430\u0433\u043e\u0432, \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 2\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u0431\u044b \u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e <code>i<\/code> \u0440\u0430\u0432\u043d\u043e\u043c\u0443 2, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u0440\u0430\u0432\u043d\u044b\u043c 1000.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0438 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>i = i + 1<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a Go \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b?<\/p>\n<p>  <\/p>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 <a href=\"https:\/\/stackoverflow.com\/questions\/37469995\/goroutines-are-cooperatively-scheduled-does-that-mean-that-goroutines-that-don\">stackoverflow<\/a>. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0432\u0441\u0435 3 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u0430 \u0437\u0430 \u0440\u0430\u0437, \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u044c\u044e\u0442\u0435\u043a\u0441. <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81\">\u041c\u044c\u044e\u0442\u0435\u043a\u0441<\/a> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0433\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0441\u043b\u0435. \u041a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043d\u0438\u043a\u0430\u043a\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412 Go \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u044b \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 <code>sync<\/code>. \u0412 Go \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>race condition<\/code>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 <code>mutex.Lock()<\/code>. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>i = i + 1<\/code> \u0432 \u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043c\u044b \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 <code>mutext.Unlock()<\/code>. \u041a\u043e\u0433\u0434\u0430 \u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>i<\/code> \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d. \u0418 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>i<\/code>. \u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043b\u044e\u0431\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u043c\u0435\u0436\u0434\u0443 <code>Lock<\/code> \u0438 <code>Unlock<\/code>, \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043d\u044f\u0442\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u044c\u044e\u0442\u0435\u043a\u0441.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;sync&quot; )  var i int \/\/ i == 0  \/\/ goroutine increment global variable i func worker(wg *sync.WaitGroup, m *sync.Mutex) {     m.Lock() \/\/ acquire lock     i = i + 1     m.Unlock() \/\/ release lock     wg.Done() }  func main() {     var wg sync.WaitGroup     var m sync.Mutex      for i := 0; i &lt; 1000; i++ {         wg.Add(1)         go worker(&amp;wg, &amp;m)     }      \/\/ wait until all 1000 goroutines are done     wg.Wait()      \/\/ value of i should be 1000     fmt.Println(&quot;value of i after 1000 operations is&quot;, i) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432\u043e \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>i<\/code>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>m.Lock()<\/code>, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>i<\/code> \u043c\u044b \u0441\u043d\u044f\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>m.Unlock()<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">value of i after 1000 operations is 1000<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441 \u043f\u043e\u043c\u043e\u0433 \u043d\u0430\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c <code>race condition<\/code>. \u041d\u043e \u0441\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 <code>race condition<\/code> \u0432 Go, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u043b\u0430\u0433 <code>race<\/code>, \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. <code>go run -race program.go<\/code>. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/blog.golang.org\/race-detector\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p><\/blockquote>\n<p>  <\/p>\n<h2 id=\"patterny-konkurentnogo-programmirovaniya\">\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0448\u0443 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u0443\u044e \u0436\u0438\u0437\u043d\u044c \u043f\u0440\u043e\u0449\u0435. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0439, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"generator\">\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440<\/h3>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u0430\u043d\u0430\u043b\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 \u043c\u043e\u0433\u0443\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u0438\u043c\u0438, \u0442\u043e \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0436\u0434\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u044f\u0434\u0430 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\">package main  import &quot;fmt&quot;  \/\/ fib returns a channel which transports fibonacci numbers func fib(length int) &lt;-chan int {     \/\/ make buffered channel     c := make(chan int, length)      \/\/ run generation concurrently     go func() {         for i, j := 0, 1; i &lt; length; i, j = i+j, i {             c &lt;- i         }         close(c)     }()      \/\/ return channel     return c }  func main() {     \/\/ read 10 fibonacci numbers from channel returned by `fib` function     for fn := range fib(10) {         fmt.Println(&quot;Current fibonacci number is&quot;, fn)     } }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Current fibonacci number is 0 Current fibonacci number is 1 Current fibonacci number is 1 Current fibonacci number is 2 Current fibonacci number is 3 Current fibonacci number is 5 Current fibonacci number is 8<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e fib, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435. \u041d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 fib, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0432 \u043e\u0434\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0441 \u0446\u0438\u043a\u043b\u043e\u043c <code>for<\/code>, \u043c\u044b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u0412 <code>main<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>range<\/code>, \u043c\u044b \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fib<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"fan-in-i-fan-out\">Fan-in \u0438 Fan-out<\/h3>\n<p>  <\/p>\n<p>Fan-in \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0445\u043e\u0434\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u043d\u0430\u043b. Fan-out \u2014 \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0434\u0438\u043d \u043a\u0430\u043d\u0430\u043b \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"go\"> package main  import (     &quot;fmt&quot;     &quot;sync&quot; )  \/\/ return channel for input numbers func getInputChan() &lt;-chan int {     \/\/ make return channel     input := make(chan int, 100)      \/\/ sample numbers     numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}      \/\/ run goroutine     go func() {         for num := range numbers {             input &lt;- num         }         \/\/ close channel once all numbers are sent to channel         close(input)     }()      return input }  \/\/ returns a channel which returns square of numbers func getSquareChan(input &lt;-chan int) &lt;-chan int {     \/\/ make return channel     output := make(chan int, 100)      \/\/ run goroutine     go func() {         \/\/ push squares until input channel closes         for num := range input {             output &lt;- num * num         }          \/\/ close output channel once for loop finishes         close(output)     }()      return output }  \/\/ returns a merged channel of `outputsChan` channels \/\/ this produce fan-in channel \/\/ this is variadic function func merge(outputsChan ...&lt;-chan int) &lt;-chan int {     \/\/ create a WaitGroup     var wg sync.WaitGroup      \/\/ make return channel     merged := make(chan int, 100)      \/\/ increase counter to number of channels `len(outputsChan)`     \/\/ as we will spawn number of goroutines equal to number of channels received to merge     wg.Add(len(outputsChan))      \/\/ function that accept a channel (which sends square numbers)     \/\/ to push numbers to merged channel     output := func(sc &lt;-chan int) {         \/\/ run until channel (square numbers sender) closes         for sqr := range sc {             merged &lt;- sqr         }         \/\/ once channel (square numbers sender) closes,         \/\/ call `Done` on `WaitGroup` to decrement counter         wg.Done()     }      \/\/ run above `output` function as groutines, `n` number of times     \/\/ where n is equal to number of channels received as argument the function     \/\/ here we are using `for range` loop on `outputsChan` hence no need to manually tell `n`     for _, optChan := range outputsChan {         go output(optChan)     }      \/\/ run goroutine to close merged channel once done     go func() {         \/\/ wait until WaitGroup finishes         wg.Wait()         close(merged)     }()      return merged }  func main() {     \/\/ step 1: get input numbers channel     \/\/ by calling `getInputChan` function, it runs a goroutine which sends number to returned channel     chanInputNums := getInputChan()      \/\/ step 2: `fan-out` square operations to multiple goroutines     \/\/ this can be done by calling `getSquareChan` function multiple times where individual function call returns a channel which sends square of numbers provided by `chanInputNums` channel     \/\/ `getSquareChan` function runs goroutines internally where squaring operation is ran concurrently     chanOptSqr1 := getSquareChan(chanInputNums)     chanOptSqr2 := getSquareChan(chanInputNums)      \/\/ step 3: fan-in (combine) `chanOptSqr1` and `chanOptSqr2` output to merged channel     \/\/ this is achieved by calling `merge` function which takes multiple channels as arguments     \/\/ and using `WaitGroup` and multiple goroutines to receive square number, we can send square numbers     \/\/ to `merged` channel and close it     chanMergedSqr := merge(chanOptSqr1, chanOptSqr2)      \/\/ step 4: let's sum all the squares from 0 to 9 which should be about `285`     \/\/ this is done by using `for range` loop on `chanMergedSqr`     sqrSum := 0      \/\/ run until `chanMergedSqr` or merged channel closes     \/\/ that happens in `merge` function when all goroutines pushing to merged channel finishes     \/\/ check line no. 86 and 87     for num := range chanMergedSqr {         sqrSum += num     }      \/\/ step 5: print sum when above `for loop` is done executing which is after `chanMergedSqr` channel closes     fmt.Println(&quot;Sum of squares between 0-9 is&quot;, sqrSum) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u0448\u0430\u0433\u0430\u043c.<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b <code>chanInputNums<\/code>, \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>getInputChan<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>getInputChan<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043a\u0430\u043d\u0430\u043b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0432 \u043a\u0430\u043d\u0430\u043b \u0447\u0438\u0441\u043b\u0430 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>numbers<\/code> \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b.<\/li>\n<li>\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430\u0448 \u043a\u0430\u043d\u0430\u043b (fan-out) \u043d\u0430 \u0434\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u0430(<code>chanOptSqr1<\/code> \u0438 <code>chanOptSqr2<\/code>), \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u0433\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>getSquareChan<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>getSquareChan<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043a\u0430\u043d\u0430\u043b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/li>\n<li>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d (fan-in), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>merge<\/code>. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>merge<\/code> \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c <code>WaitGroup<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u043d\u0430\u043b(<code>merged<\/code>), \u0433\u0434\u0435 \u043c\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 <code>outputsChan<\/code>, \u043f\u043e\u0441\u043b\u0435, \u043c\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u043d\u0430\u043b <code>merged<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u043d\u044b. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0434\u0438\u043d \u043a\u0430\u043d\u0430\u043b \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u043d\u0430\u043b <code>merged<\/code>.<\/li>\n<li>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 <code>chanMergedSqr<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>for<\/code> \u0438 <code>range<\/code>, \u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/li>\n<li>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430\u0448 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Sum of squares between 0-9 is 285<\/code><\/pre>\n<\/div>\n<p> \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\/post\/490336\/\"> https:\/\/habr.com\/ru\/post\/490336\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/490336\/\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/medium.com\/rungo\/anatomy-of-channels-in-go-concurrency-in-go-1ec336086adb\">&quot;Anatomy of Channels in Go&quot;<\/a> \u0430\u0432\u0442\u043e\u0440\u0430 Uday Hiwarale.<\/p>\n<p>  <\/p>\n<h2 id=\"chto-takoe-kanaly\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043d\u0430\u043b\u044b?<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u043d\u0430\u043b \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0432\u044f\u0437\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 (\u0438\u043b\u0438 \u0442\u0440\u0443\u0431\u0430), \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0430\u043d\u0430\u043b, \u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u2014 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"sozdanie-kanala\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430<\/h2>\n<p>  <\/p>\n<p>Go \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e chan. \u041a\u0430\u043d\u0430\u043b \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\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-299401","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/299401","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=299401"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/299401\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=299401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=299401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=299401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}