{"id":360,"date":"2024-09-21T12:26:26","date_gmt":"2024-09-21T05:26:26","guid":{"rendered":"https:\/\/gotutorial.org\/?page_id=360"},"modified":"2024-09-22T11:47:09","modified_gmt":"2024-09-22T04:47:09","slug":"go-channels","status":"publish","type":"page","link":"https:\/\/www.gotutorial.org\/go-tutorial\/go-channels\/","title":{"rendered":"Go Channels"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you will learn how to use Go channels to allow goroutines to communicate with each other.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to Go channels<\/h2>\n\n\n\n<p>In Go, channels are used to pass data between <a href=\"https:\/\/gotutorial.org\/go-tutorial\/goroutines\/\">goroutines<\/a>. In other words, goroutines share data by communicating with each other via channels.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creating channels<\/h3>\n\n\n\n<p>To create a channel, you use the <code>var<\/code> keyword, followed by the channel name, the <code>chan<\/code> keyword, and the data type of the channel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">var<\/span> channelName <span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">type<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">var<\/span> ch <span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this example, we define a channel <code>ch<\/code> with the type <code>string<\/code>. The <code>ch<\/code> channel allows goroutines to send and receive strings only.<\/p>\n\n\n\n<p>Alternatively, you can use the built-in <code>make()<\/code> function to create a channel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">ch := <span class=\"hljs-built_in\">make<\/span>(<span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Sending data to channels<\/h3>\n\n\n\n<p>To send data to a channel, you use the <code>&lt;-<\/code> operator:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">channel &lt;- data<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For example, the following shows how to send the message <code>\"Hi\"<\/code> to the channel <code>ch<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">ch &lt;- <span class=\"hljs-string\">\"Hi\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you attempt to send a value that is not a string to the <code>ch<\/code> channel, you&#8217;ll encounter a compilation error. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Receiving data from channels<\/h3>\n\n\n\n<p>To receive data from a channel, you use the <code>&lt;-<\/code> operator:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">&lt;- channel<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The following example shows how to receive a string message from a channel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">mesage := &lt;- channel<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Receiving data from a channel will <em>block <\/em>the goroutine until the message is received.<\/p>\n\n\n\n<p>Additionally, you can use a <a href=\"https:\/\/gotutorial.org\/go-tutorial\/go-for-range\/\">for range loop<\/a> to read data from a channel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">for<\/span> data := <span class=\"hljs-keyword\">range<\/span> channel {\n    <span class=\"hljs-comment\">\/\/ process the data<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Putting it all together<\/h3>\n\n\n\n<p>Here&#8217;s the complete program that demonstrates how to use a channel to exchange data between goroutines:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"fmt\"<\/span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    ch := <span class=\"hljs-built_in\">make<\/span>(<span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)\n\n    <span class=\"hljs-keyword\">go<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n        ch &lt;- <span class=\"hljs-string\">\"Hi\"<\/span>\n    }()\n\n    message := &lt;-ch\n    fmt.Println(message)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, create a channel <code>ch<\/code> with the type of <code>string<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">ch := <span class=\"hljs-built_in\">make<\/span>(<span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, spawn a new goroutine that sends the message <code>\"Hi\"<\/code> to the <code>ch<\/code> channel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">go<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    ch &lt;- <span class=\"hljs-string\">\"Hi\"<\/span>\n}()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, receive the <code>message<\/code> from the channel <code>ch<\/code> in the main goroutine: <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">message := &lt;-ch<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"note\">Note that the main goroutine will not complete until it receives the <code>message<\/code> from the <code>ch<\/code> channel.<\/p>\n\n\n\n<p>Finally, display the message on the screen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">fmt.Println(message)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the following modified version of the program, the goroutine sends data to the channel after 3 seconds. Therefore, the <code>main<\/code> goroutine will wait for the same amount of time before receiving the data:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> (\n    <span class=\"hljs-string\">\"fmt\"<\/span>\n    <span class=\"hljs-string\">\"time\"<\/span>\n)\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Starting the program...\"<\/span>)\n    ch := <span class=\"hljs-built_in\">make<\/span>(<span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)\n\n    <span class=\"hljs-keyword\">go<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n        time.Sleep(<span class=\"hljs-number\">3<\/span> * time.Second)\n        ch &lt;- <span class=\"hljs-string\">\"Hi\"<\/span>\n    }()\n\n    message := &lt;-ch\n    fmt.Println(message)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">Starting the program...\nHi<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The message <code>Hi<\/code> appears after 3 seconds after the program starts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deadlocks<\/h2>\n\n\n\n<p>The following program causes a <em>deadlock <\/em>that you may encounter when start working with channels:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"fmt\"<\/span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    ch := <span class=\"hljs-built_in\">make<\/span>(<span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)\n\n    <span class=\"hljs-keyword\">go<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n        ch &lt;- <span class=\"hljs-string\">\"Hi\"<\/span>\n    }()\n\n    message := &lt;-ch\n    fmt.Println(message)\n\n    <span class=\"hljs-comment\">\/\/ Error: deadlock<\/span>\n    message = &lt;-ch\n    fmt.Println(message)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">Hi\nfatal error: all goroutines are asleep - deadlock!<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, a goroutine sends the message <code>\"Hi\"<\/code> to the channel.<\/li>\n\n\n\n<li>Second, the <code>main<\/code> goroutine receives and prints the message.<\/li>\n\n\n\n<li>Third, the main goroutine attempts to receive more data from the channel. However, no more data is sent to the channel, and the second receiving operation blocks <em>indefinitely<\/em>, causing a deadlock.<\/li>\n<\/ul>\n\n\n\n<p>To prevent deadlocks, you should ensure every send has a matching receipt. In other words, there should be a corresponding receipt for every message you send, and vice versa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A practical example of Go channels<\/h2>\n\n\n\n<p>The following example shows how to check the status of a list of <code>URLs<\/code> concurrently:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> (\n    <span class=\"hljs-string\">\"fmt\"<\/span>\n    <span class=\"hljs-string\">\"net\/http\"<\/span>\n)\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">check<\/span><span class=\"hljs-params\">(url <span class=\"hljs-keyword\">string<\/span>, ch <span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)<\/span><\/span> {\n    _, err := http.Get(url)\n    <span class=\"hljs-keyword\">if<\/span> err != <span class=\"hljs-literal\">nil<\/span> {\n        ch &lt;- fmt.Sprintf(<span class=\"hljs-string\">\"The %s is down.\"<\/span>, url)\n    } <span class=\"hljs-keyword\">else<\/span> {\n        ch &lt;- fmt.Sprintf(<span class=\"hljs-string\">\"The %s is up.\"<\/span>, url)\n    }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    urls := &#91;]<span class=\"hljs-keyword\">string<\/span>{\n        <span class=\"hljs-string\">\"https:\/\/google.com\"<\/span>,\n        <span class=\"hljs-string\">\"https:\/\/go.dev\"<\/span>,\n        <span class=\"hljs-string\">\"https:\/\/abcdef.test\/\"<\/span>,\n    }\n    ch := <span class=\"hljs-built_in\">make<\/span>(<span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)\n    <span class=\"hljs-keyword\">for<\/span> _, url := <span class=\"hljs-keyword\">range<\/span> urls {\n        <span class=\"hljs-keyword\">go<\/span> check(url, ch)\n    }\n\n    <span class=\"hljs-keyword\">for<\/span> i := <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-built_in\">len<\/span>(urls); i++ {\n        fmt.Println(&lt;-ch)\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define a function that accepts a URL to check and a channel to send data to once the checking completes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">check<\/span><span class=\"hljs-params\">(url <span class=\"hljs-keyword\">string<\/span>, ch <span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)<\/span><\/span> {\n    _, err := http.Get(url)\n    <span class=\"hljs-keyword\">if<\/span> err != <span class=\"hljs-literal\">nil<\/span> {\n        ch &lt;- fmt.Sprintf(<span class=\"hljs-string\">\"The %s is down.\"<\/span>, url)\n    } <span class=\"hljs-keyword\">else<\/span> {\n        ch &lt;- fmt.Sprintf(<span class=\"hljs-string\">\"The %s is up.\"<\/span>, url)\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Next, declare and initialize a list of <code>URLs<\/code> to check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">urls := &#91;]<span class=\"hljs-keyword\">string<\/span>{\n    <span class=\"hljs-string\">\"https:\/\/google.com\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/go.dev\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/abcdef.test\/\"<\/span>,\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then, create a channel to exchange the messages:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">ch := <span class=\"hljs-built_in\">make<\/span>(<span class=\"hljs-keyword\">chan<\/span> <span class=\"hljs-keyword\">string<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>After that, spawn goroutines to check the <code>URLs<\/code> concurrently:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">for<\/span> _, url := <span class=\"hljs-keyword\">range<\/span> urls {\n    <span class=\"hljs-keyword\">go<\/span> check(url, ch)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, receive the URL status from the ch channel in the main goroutine:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">for<\/span> i := <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-built_in\">len<\/span>(urls); i++ {\n    fmt.Println(&lt;-ch)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use channels to send and receive data between goroutines.<\/li>\n\n\n\n<li>Use the <code>channel &lt;- data<\/code> syntax to send data to a channel.<\/li>\n\n\n\n<li>Use the <code>data := &lt;- channel<\/code> to receive data from a channel.<\/li>\n\n\n\n<li>Ensure the number of sends and receives are matched to avoid deadlocks.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<div class=\"wth-question\">Was this tutorial helpful?<\/div>\n\t<div class=\"wth-thumbs\">\n\t\t<button\n\t\t\tdata-post=\"360\"\n\t\t\tdata-post-url=\"https:\/\/www.gotutorial.org\/go-tutorial\/go-channels\/\"\n\t\t\tdata-post-title=\"Go Channels\"\n\t\t\tdata-response=\"1\"\n\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t>\n\t\t\t<svg\n\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\"\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t><\/path>\n\t\t\t<\/svg>\n\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t<\/button>\n\n\t\t<button\n\t\t\tdata-response=\"0\"\n\t\t\tdata-post=\"360\"\n\t\t\tdata-post-url=\"https:\/\/www.gotutorial.org\/go-tutorial\/go-channels\/\"\n\t\t\tdata-post-title=\"Go Channels\"\n\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t>\n\t\t\t<svg\n\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\"\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t><\/path>\n\t\t\t<\/svg>\n\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t<\/button>\n\t<\/div>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\t\t\t<input type=\"button\" name=\"wth-submit\" class=\"wth-btn wth-btn-submit\" id=\"wth-submit\" \/>\n\t\t\t<input type=\"button\" class=\"wth-btn wth-btn-cancel\" value=\"Cancel\" \/>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you will learn how to use Go channels to allow goroutines to communicate with each other.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":10,"menu_order":27,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-360","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/comments?post=360"}],"version-history":[{"count":7,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/360\/revisions"}],"predecessor-version":[{"id":381,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/360\/revisions\/381"}],"up":[{"embeddable":true,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/10"}],"wp:attachment":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/media?parent=360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}