<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Go on avni.sh</title>
    <link>http://www.avni.sh/posts/go/</link>
    <description>Recent content in Go on avni.sh</description>
    <image>
      <title>avni.sh</title>
      <url>http://www.avni.sh/cover.webp</url>
      <link>http://www.avni.sh/cover.webp</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 15 Sep 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://www.avni.sh/posts/go/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>REST API Requests in Go</title>
      <link>http://www.avni.sh/posts/go/rest-api-requests-in-go/</link>
      <pubDate>Fri, 15 Sep 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/go/rest-api-requests-in-go/</guid>
      <description>Performing HTTP requests on REST APIs with Go</description>
      <content:encoded><![CDATA[<h1 id="what-is-rest">What is REST?</h1>
<p>REST (REpresentational State Transfer) is an architectural style for designing and developing APIs that could be used for client and server interactions.</p>
<p>REST defines 6 architectural constraints for APIs:</p>
<ul>
<li>Uniform interface: API requests for a resource should look the same irrespective of its origin client. The Uniform Resource Identifier (URI) allocated to resources should be unique.</li>
<li>Client-server: Changes on the client side should not affect the server and vice-versa.</li>
<li>Stateless: The API request should contain all the resources required to process it. The server should not store any details related to client requests.</li>
<li>Cacheable: API Responses could be cached on the client or server side.</li>
<li>Layered system: Neither the client nor the server should have information regarding the number of intermediate layers during communication.</li>
<li>Code on demand (optional): When required, code snippets sent through API responses should be executable on demand.</li>
</ul>
<p>APIs that comply with REST architecture constraints are called <strong>RESTful APIs</strong>.</p>
<h1 id="rest-requests">REST Requests</h1>
<p>A REST request comprises of:</p>
<ul>
<li>HTTP Verb: Specifies the type of operation to be performed on resource/s like creation, fetch, updation, and deletion.</li>
<li>Header: Contains the information about the request like its datatype (<code>text/html</code>, <code>text/plain</code>, <code>application/json</code>, etc.), credentials, proxy server address, etc.</li>
<li>Path: Path to the resource (URI)</li>
<li>Body: Input data for the operation.</li>
</ul>
<h1 id="http-verbs">HTTP Verbs</h1>
<p><code>GET</code>, <code>POST</code>, <code>PUT</code>, and <code>DELETE</code> are common HTTP verbs available in RESTful APIs.</p>
<p><strong>Note</strong>: To follow this tutorial you need to head over to <a href="https://crudcrud.com/" target="_blank">crudcrud.com</a> to get a new API endpoint.</p>
<p>The <code>net/http</code> Go package provides all the necessary utilities for implementing REST clients and servers.</p>
<h2 id="post"><code>POST</code></h2>
<p>A <code>POST</code> request is performed to create resources.</p>
<p>If we have to perform a <code>POST</code> request on the API endpoint provided by crudcrud.com we have to pass the resource (to be created) as a <a href="/posts/go/file-handling-in-go/#encoding-json" target="_blank">JSON payload</a> in the request&rsquo;s body.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;net/http&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;bytes&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;io/ioutil&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Replace with the API ID provided by crudcrud.com</span>
</span></span><span class="line"><span class="cl">	<span class="nx">apiID</span> <span class="o">:=</span> <span class="s">&#34;XXXXXX&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// HTTP endpoint with path of resource (vehicles)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">createResourceURL</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintf</span><span class="p">(</span><span class="s">&#34;https://crudcrud.com/api/%s/vehicles&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">									<span class="nx">apiID</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// JSON payload containing resource information</span>
</span></span><span class="line"><span class="cl">	<span class="nx">requestBody</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;color&#34;</span><span class="p">:</span> <span class="s">&#34;White&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;license&#34;</span><span class="p">:</span> <span class="s">&#34;ABC123&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;numWheels&#34;</span><span class="p">:</span> <span class="s">&#34;4&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;type&#34;</span><span class="p">:</span> <span class="s">&#34;Car&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Converting request body into bytes buffer</span>
</span></span><span class="line"><span class="cl">	<span class="nx">requestBodyBytes</span> <span class="o">:=</span> <span class="nx">bytes</span><span class="p">.</span><span class="nf">NewBuffer</span><span class="p">(</span><span class="nx">requestBody</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Creating a POST request on createResourceURL</span>
</span></span><span class="line"><span class="cl">	<span class="nx">request</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">http</span><span class="p">.</span><span class="nf">NewRequest</span><span class="p">(</span><span class="s">&#34;POST&#34;</span><span class="p">,</span> <span class="nx">createResourceURL</span><span class="p">,</span> <span class="nx">requestBodyBytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Adding application/json as payload type </span>
</span></span><span class="line"><span class="cl">	<span class="nx">request</span><span class="p">.</span><span class="nx">Header</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="s">&#34;Content-Type&#34;</span><span class="p">,</span> <span class="s">&#34;application/json&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">client</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">http</span><span class="p">.</span><span class="nx">Client</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Performing POST request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">response</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Do</span><span class="p">(</span><span class="nx">request</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Reading the response to the request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">responseBody</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ioutil</span><span class="p">.</span><span class="nf">ReadAll</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Error received in response:&#34;</span><span class="p">,</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">responseBodyString</span> <span class="o">:=</span> <span class="nb">string</span><span class="p">(</span><span class="nx">responseBody</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">responseBodyString</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// {&#34;color&#34;:&#34;White&#34;,&#34;license&#34;:&#34;ABC123&#34;,&#34;numWheels&#34;:&#34;4&#34;,&#34;type&#34;:&#34;Car&#34;,</span>
</span></span><span class="line"><span class="cl"><span class="c1">// &#34;_id&#34;:&#34;6501480bb987ad03e8769e4}</span>
</span></span></code></pre></div><p>To check the resource on the server side you can click on the &ldquo;Check Endpoint Information&rdquo; button on the crudcrud.com page. A new REST resource named <code>vehicles</code> would have been created.</p>
<h2 id="get"><code>GET</code></h2>
<p>To fetch all <code>vehicles</code> resources created by the <code>POST</code> request we will perform a <code>GET</code> request on the same API endpoint.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;net/http&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;io/ioutil&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Id</span>          <span class="kt">string</span> <span class="s">`json:&#34;_id&#34;`</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span>       <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">License</span>     <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span>   <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">VehicleType</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Replace this with the API ID provided by crudcrud.com</span>
</span></span><span class="line"><span class="cl">	<span class="nx">apiID</span> <span class="o">:=</span> <span class="s">&#34;XXXXXX&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// HTTP endpoint with the path of the resource (vehicles)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fetchResourceURL</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintf</span><span class="p">(</span><span class="s">&#34;https://crudcrud.com/api/%s/vehicles&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">									<span class="nx">apiID</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Performing GET request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">response</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">http</span><span class="p">.</span><span class="nf">Get</span><span class="p">(</span><span class="nx">fetchResourceURL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Reading the response to the request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">responseBody</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ioutil</span><span class="p">.</span><span class="nf">ReadAll</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Error received in response:&#34;</span><span class="p">,</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Marshalling the response of API into a list of type Vehicle</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">vehicles</span> <span class="p">[]</span><span class="nx">Vehicle</span>
</span></span><span class="line"><span class="cl">	<span class="nx">json</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">responseBody</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">vehicles</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">veh</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">vehicles</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle Resource ID:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">Id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Color:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">Color</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;License:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">License</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;NumWheels:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">NumWheels</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Type:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">VehicleType</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle Resource ID: 65014c0ab987ad03e8769e5c</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Color: Black</span>
</span></span><span class="line"><span class="cl"><span class="c1">// License: XYZ435</span>
</span></span><span class="line"><span class="cl"><span class="c1">// NumWheels: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Type: Car</span>
</span></span><span class="line"><span class="cl"><span class="c1">//</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle Resource ID: 65014c1cb987ad03e8769e5d</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Color: White</span>
</span></span><span class="line"><span class="cl"><span class="c1">// License: ABC123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// NumWheels: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Type: Car</span>
</span></span><span class="line"><span class="cl"><span class="c1">//</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle Resource ID: 65014c59b987ad03e8769e5e</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Color: Red</span>
</span></span><span class="line"><span class="cl"><span class="c1">// License: IJK546</span>
</span></span><span class="line"><span class="cl"><span class="c1">// NumWheels: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Type: Motorcycle</span>
</span></span></code></pre></div><p>We can also fetch specific resources by specifying their <code>_id</code> in URI.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;net/http&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;io/ioutil&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Id</span>          <span class="kt">string</span> <span class="s">`json:&#34;_id&#34;`</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span>       <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">License</span>     <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span>   <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">VehicleType</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Replace this API ID with the one provided by crudcrud.com</span>
</span></span><span class="line"><span class="cl">	<span class="nx">apiID</span> <span class="o">:=</span> <span class="s">&#34;XXXXXX&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Replace this with the ID of the resource you want to fetch</span>
</span></span><span class="line"><span class="cl">	<span class="nx">vehicleResourceID</span> <span class="o">:=</span> <span class="s">&#34;65014c59b987ad03e8769e5e&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// HTTP endpoint with the path of the resource (vehicles)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fetchResourceURL</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintf</span><span class="p">(</span><span class="s">&#34;https://crudcrud.com/api/%s/vehicles/%s&#34;</span><span class="p">,</span>	
</span></span><span class="line"><span class="cl">							<span class="nx">apiID</span><span class="p">,</span> <span class="nx">vehicleResourceID</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Performing GET request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">response</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">http</span><span class="p">.</span><span class="nf">Get</span><span class="p">(</span><span class="nx">fetchResourceURL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Reading the response to the request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">responseBody</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ioutil</span><span class="p">.</span><span class="nf">ReadAll</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Error received in response:&#34;</span><span class="p">,</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Unmarshalling the response of API into a list of type Vehicle</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">veh</span> <span class="nx">Vehicle</span>
</span></span><span class="line"><span class="cl">	<span class="nx">json</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">responseBody</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">veh</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle Resource ID:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">Id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Color:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">Color</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;License:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">License</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;NumWheels:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">NumWheels</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Type:&#34;</span><span class="p">,</span> <span class="nx">veh</span><span class="p">.</span><span class="nx">VehicleType</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle Resource ID: 65014c59b987ad03e8769e5e</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Color: Red</span>
</span></span><span class="line"><span class="cl"><span class="c1">// License: IJK546</span>
</span></span><span class="line"><span class="cl"><span class="c1">// NumWheels: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Type: Motorcycle</span>
</span></span></code></pre></div><h2 id="put"><code>PUT</code></h2>
<p>To update a resource we perform a <code>PUT</code> request.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;net/http&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;bytes&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;io/ioutil&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Replace this API ID with the one provided by crudcrud.com</span>
</span></span><span class="line"><span class="cl">	<span class="nx">apiID</span> <span class="o">:=</span> <span class="s">&#34;XXXXXX&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">vehicleResourceID</span> <span class="o">:=</span> <span class="s">&#34;65014c0ab987ad03e8769e5c&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// HTTP endpoint with path (vehicle) of the resource</span>
</span></span><span class="line"><span class="cl">	<span class="nx">updateResourceURL</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintf</span><span class="p">(</span><span class="s">&#34;https://crudcrud.com/api/%s/vehicles/%s&#34;</span><span class="p">,</span>	
</span></span><span class="line"><span class="cl">							<span class="nx">apiID</span><span class="p">,</span> <span class="nx">vehicleResourceID</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// JSON payload as bytes</span>
</span></span><span class="line"><span class="cl">	<span class="nx">requestBody</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;color&#34;</span><span class="p">:</span> <span class="s">&#34;Black&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;license&#34;</span><span class="p">:</span> <span class="s">&#34;XYZ435&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;numWheels&#34;</span><span class="p">:</span> <span class="s">&#34;2&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;vehicleType&#34;</span><span class="p">:</span> <span class="s">&#34;Motorcycle&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Converting request body into bytes buffer</span>
</span></span><span class="line"><span class="cl">	<span class="nx">requestBodyBytes</span> <span class="o">:=</span> <span class="nx">bytes</span><span class="p">.</span><span class="nf">NewBuffer</span><span class="p">(</span><span class="nx">requestBody</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Creating a PUT request on updateResourceURL</span>
</span></span><span class="line"><span class="cl">	<span class="nx">request</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">http</span><span class="p">.</span><span class="nf">NewRequest</span><span class="p">(</span><span class="s">&#34;PUT&#34;</span><span class="p">,</span> <span class="nx">updateResourceURL</span><span class="p">,</span> <span class="nx">requestBodyBytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Adding application/json as payload type </span>
</span></span><span class="line"><span class="cl">	<span class="nx">request</span><span class="p">.</span><span class="nx">Header</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="s">&#34;Content-Type&#34;</span><span class="p">,</span> <span class="s">&#34;application/json&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">client</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">http</span><span class="p">.</span><span class="nx">Client</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Performing PUT request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">response</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Do</span><span class="p">(</span><span class="nx">request</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Verifying changes by fetching the details of the resource</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Performing GET request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">responseGet</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">http</span><span class="p">.</span><span class="nf">Get</span><span class="p">(</span><span class="nx">updateResourceURL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">responseGet</span><span class="p">.</span><span class="nx">Body</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Reading the response to the request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">responseBody</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ioutil</span><span class="p">.</span><span class="nf">ReadAll</span><span class="p">(</span><span class="nx">responseGet</span><span class="p">.</span><span class="nx">Body</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Error received in response:&#34;</span><span class="p">,</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Updated Resource:&#34;</span><span class="p">,</span><span class="nb">string</span><span class="p">(</span><span class="nx">responseBody</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Updated Resource: {&#34;_id&#34;:&#34;65014c0ab987ad03e8769e5c&#34;,&#34;color&#34;:&#34;Black&#34;,</span>
</span></span><span class="line"><span class="cl"><span class="c1">// &#34;license&#34;:&#34;XYZ435&#34;,&#34;numWheels&#34;:&#34;2&#34;,&#34;vehicleType&#34;:&#34;Motorcycle&#34;}</span>
</span></span></code></pre></div><h2 id="delete"><code>DELETE</code></h2>
<p>The <code>DELETE</code> verb is used for resource deletion requests.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;net/http&#34;</span>
</span></span><span class="line"><span class="cl">   <span class="s">&#34;io/ioutil&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Replace this API ID with the one provided by crudcrud.com</span>
</span></span><span class="line"><span class="cl">	<span class="nx">apiID</span> <span class="o">:=</span> <span class="s">&#34;XXXXXX&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">vehicleResourceID</span> <span class="o">:=</span> <span class="s">&#34;65014c0ab987ad03e8769e5c&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// HTTP endpoint with path (vehicle) of the resource</span>
</span></span><span class="line"><span class="cl">	<span class="nx">deleteResourceURL</span> <span class="o">:=</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintf</span><span class="p">(</span><span class="s">&#34;https://crudcrud.com/api/%s/vehicles/%s&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">							<span class="nx">apiID</span><span class="p">,</span> <span class="nx">vehicleResourceID</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Creating a DELETE request on deleteResourceURL</span>
</span></span><span class="line"><span class="cl">	<span class="nx">request</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">http</span><span class="p">.</span><span class="nf">NewRequest</span><span class="p">(</span><span class="s">&#34;DELETE&#34;</span><span class="p">,</span> <span class="nx">deleteResourceURL</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Adding application/json as payload type </span>
</span></span><span class="line"><span class="cl">	<span class="nx">request</span><span class="p">.</span><span class="nx">Header</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="s">&#34;Content-Type&#34;</span><span class="p">,</span> <span class="s">&#34;application/json&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">client</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">http</span><span class="p">.</span><span class="nx">Client</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Performing DELETE request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">response</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Do</span><span class="p">(</span><span class="nx">request</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">response</span><span class="p">.</span><span class="nx">Body</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Performing GET request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">responseGet</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">http</span><span class="p">.</span><span class="nf">Get</span><span class="p">(</span><span class="nx">deleteResourceURL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">responseGet</span><span class="p">.</span><span class="nx">Body</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Reading the response to the request</span>
</span></span><span class="line"><span class="cl">	<span class="nx">responseBody</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ioutil</span><span class="p">.</span><span class="nf">ReadAll</span><span class="p">(</span><span class="nx">responseGet</span><span class="p">.</span><span class="nx">Body</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Error received in response:&#34;</span><span class="p">,</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Deleted Resource:&#34;</span><span class="p">,</span><span class="nb">string</span><span class="p">(</span><span class="nx">responseBody</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Deleted Resource: {&#34;type&#34;:&#34;https://tools.ietf.org/html/rfc7231#section-6.5.4&#34;,</span>
</span></span><span class="line"><span class="cl"><span class="c1">// &#34;title&#34;:&#34;Not Found&#34;,&#34;status&#34;:404,&#34;traceId&#34;:&#34;0HMTFDGO4V3QF:00000001&#34;}</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://restfulapi.net/" target="_blank">REST API Tutorial</a><br>
<a href="https://www.codecademy.com/article/what-is-rest" target="_blank">What is REST?</a><br>
<a href="https://restfulapi.net/rest-architectural-constraints/" target="_blank">REST Architectural Constraints</a><br>
<a href="https://pkg.go.dev/net/http" target="_blank"><code>net/http</code> Go Package</a><br>
<a href="https://pkg.go.dev/net/http#pkg-constants" target="_blank">HTTP Verbs in <code>net/http</code> package</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Concurrency in Go</title>
      <link>http://www.avni.sh/posts/go/concurrency-in-go/</link>
      <pubDate>Tue, 12 Sep 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/go/concurrency-in-go/</guid>
      <description>Implementing concurrent programs in Go using goroutines, channels, and WaitGroups</description>
      <content:encoded><![CDATA[<p>We can make a program concurrent if we can split it as multiple independent tasks executed at the same time.</p>
<p>In concurrency, we execute different portions of a program at the same time (on single or multiple CPU threads) whereas in parallelism a singular task (or subtasks) is executed parallelly on multiple CPU threads.</p>
<blockquote>
<p>Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.</p>
<p><cite><a href="https://youtu.be/oV9rvDllKEg" target=_blank>Rob Pike</a>, Co-Creator of Go</cite></p></blockquote>
<h1 id="goroutines">Goroutines</h1>
<p>By adding the <code>go</code> keyword before a statement we can start a new <strong>goroutine</strong>. It will create a lightweight execution thread to execute the statement concurrently with the succeeding tasks in its parent function.</p>
<p>The program will end once the <code>main</code> goroutine is finished irrespective of the current state of other goroutines.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="c1">// Example of a non-concurrent program</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">testFunc</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">j</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">j</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">j</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Hello from testfunc&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">testFunc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Hello from main&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from testfunc</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from testfunc</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from testfunc</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from main</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from main</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from main</span>
</span></span></code></pre></div><p>The output of this program will be three statements from <code>testFunc()</code> functions followed by three statements from the <code>main()</code> function.</p>
<p>But, if we add the <code>go</code> keyword before <code>testFunc()</code>, we can create a new <em>goroutine</em> that will execute the <code>testFunc()</code> function concurrently with the statements in <code>main()</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">testFunc</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">j</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">j</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">j</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Hello from testfunc&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">go</span> <span class="nf">testFunc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="mi">3</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Hello from main&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from main</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from testfunc</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from testfunc</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from testfunc</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from main</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from main</span>
</span></span></code></pre></div><h1 id="channels">Channels</h1>
<p>To send and receive values between Goroutines we have <strong>channels</strong>.</p>
<p>Channels are declared using the <code>make(chan &lt;datatype&gt;)</code> function with the datatype of the transmitted value, for example, <code>make(chan string)</code> will create a channel that could be used to send and receive <code>string</code> values.</p>
<p><code>chan&lt;- string</code> denotes a send-only channel and <code>&lt;-chan string</code> denotes a receive-only channel for string values.</p>
<p>To iterate over the values received on a channel we can define a <code>for</code> loop with <code>range</code> like in the program below.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;math/rand&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Sends random integer on randomVal channel every 2 seconds</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">getRandomValue</span><span class="p">(</span><span class="nx">randomVal</span> <span class="kd">chan</span><span class="o">&lt;-</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">numValues</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="nx">numValues</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">value</span> <span class="o">:=</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Int</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">                <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;getRandomValue(): Sent Random Integer&#34;</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// Send a value to randomVal channel</span>
</span></span><span class="line"><span class="cl">                <span class="nx">randomVal</span> <span class="o">&lt;-</span> <span class="nx">value</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// 2 seconds interval to ensure that the receiver gets enough time</span>
</span></span><span class="line"><span class="cl">                <span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="nb">close</span><span class="p">(</span><span class="nx">randomVal</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Listens to channel randomVal and prints received values on the terminal</span>
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">receiveRandomValue</span><span class="p">(</span><span class="nx">randomVal</span> <span class="o">&lt;-</span><span class="kd">chan</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// Loops over values received in channel</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">randomVal</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;recieveRandomValue(): Received Random Integer&#34;</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">randomValueChannel</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">go</span> <span class="nf">getRandomValue</span><span class="p">(</span><span class="nx">randomValueChannel</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">go</span> <span class="nf">receiveRandomValue</span><span class="p">(</span><span class="nx">randomValueChannel</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">// To ensure that the main goroutine doesn&#39;t end </span>
</span></span><span class="line"><span class="cl">        <span class="c1">// before the other two goroutines</span>
</span></span><span class="line"><span class="cl">        <span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// getRandomValue(): Sent Random Integer 7680245871766720879</span>
</span></span><span class="line"><span class="cl"><span class="c1">// recieveRandomValue(): Received Random Integer 7680245871766720879</span>
</span></span><span class="line"><span class="cl"><span class="c1">// getRandomValue(): Sent Random Integer 1813843778283051521</span>
</span></span><span class="line"><span class="cl"><span class="c1">// recieveRandomValue(): Received Random Integer 1813843778283051521</span>
</span></span><span class="line"><span class="cl"><span class="c1">// getRandomValue(): Sent Random Integer 3359384099851901129</span>
</span></span><span class="line"><span class="cl"><span class="c1">// recieveRandomValue(): Received Random Integer 3359384099851901129</span>
</span></span><span class="line"><span class="cl"><span class="c1">// getRandomValue(): Sent Random Integer 3707965584748576540</span>
</span></span><span class="line"><span class="cl"><span class="c1">// recieveRandomValue(): Received Random Integer 3707965584748576540</span>
</span></span><span class="line"><span class="cl"><span class="c1">// getRandomValue(): Sent Random Integer 282243786570954167</span>
</span></span><span class="line"><span class="cl"><span class="c1">// recieveRandomValue(): Received Random Integer 282243786570954167</span>
</span></span></code></pre></div><p>A Go program finishes execution whenever the main goroutine is completed ignoring the current progress of other goroutines. To prevent this we can use a channel to flag completion of a goroutine.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;math/rand&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">getRandomInt</span><span class="p">(</span><span class="nx">doneFlag</span> <span class="kd">chan</span> <span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Goroutine for getRandomInt() started&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Some random integer: &#34;</span><span class="p">,</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Int</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">	<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Will send value to the channel</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// once the function is finished</span>
</span></span><span class="line"><span class="cl">	<span class="nx">doneFlag</span><span class="o">&lt;-</span><span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">done</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="nf">getRandomInt</span><span class="p">(</span><span class="nx">done</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Main Goroutine will wait to receive a value on this channel</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;-</span><span class="nx">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Main Goroutine has ended&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Goroutine for getRandomInt() started</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Some random integer:  4571662314887367842</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Main Goroutine has ended</span>
</span></span></code></pre></div><p>If we ran this program without <code>&lt;-done</code> the main goroutine would&rsquo;ve ended the program preemptively and its output would be</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">Main Goroutine has ended
</span></span></code></pre></div><h2 id="buffering">Buffering</h2>
<p>A channel won&rsquo;t send values unless there is another channel ready to receive those values. But <strong>Buffered Channels</strong> allow a certain amount of values to be sent without a corresponding receiver for those values.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleBufferedChan</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">string</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Sending values to the buffered channel</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleBufferedChan</span><span class="o">&lt;-</span><span class="s">&#34;c&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleBufferedChan</span><span class="o">&lt;-</span><span class="s">&#34;b&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleBufferedChan</span><span class="o">&lt;-</span><span class="s">&#34;a&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Receiving values from the buffered channel</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value 1 from exampleBufferedChan:&#34;</span><span class="p">,</span><span class="o">&lt;-</span><span class="nx">exampleBufferedChan</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value 2 from exampleBufferedChan:&#34;</span><span class="p">,</span><span class="o">&lt;-</span><span class="nx">exampleBufferedChan</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value 3 from exampleBufferedChan:&#34;</span><span class="p">,</span><span class="o">&lt;-</span><span class="nx">exampleBufferedChan</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value 1 from exampleBufferedChan: c</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value 2 from exampleBufferedChan: b</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value 3 from exampleBufferedChan: a</span>
</span></span></code></pre></div><p>The values from the channel will be received in the same order as they were sent.</p>
<h1 id="select">Select</h1>
<p>The <code>select</code> keyword is used to wait for values on multiple channels simultaneously. Its syntax is similar to a <a href="/posts/go/go-programming-language/#switch-cases" target="_blank"><code>switch</code></a>.</p>
<p><code>select</code> executes the first channel to receive value in <code>case</code> statements. If multiple channels are ready with values then one of them is selected at random.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;math/rand&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">randomValueGenerator</span><span class="p">(</span><span class="nx">randomValueChannel</span> <span class="kd">chan</span><span class="o">&lt;-</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">randomValueChannel</span> <span class="o">&lt;-</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Int</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">channel1</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">int</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">channel2</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">int</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="nf">randomValueGenerator</span><span class="p">(</span><span class="nx">channel1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">randomValueGenerator</span><span class="p">(</span><span class="nx">channel2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Wait on channel1 and channel2 to receive values	</span>
</span></span><span class="line"><span class="cl">	<span class="k">select</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">case</span> <span class="nx">message1</span> <span class="o">:=</span> <span class="o">&lt;-</span> <span class="nx">channel1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Received value in channel1:&#34;</span><span class="p">,</span> <span class="nx">message1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">case</span> <span class="nx">message2</span> <span class="o">:=</span> <span class="o">&lt;-</span> <span class="nx">channel2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Received value in channel2:&#34;</span><span class="p">,</span> <span class="nx">message2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Received value in channel2: 1923060859381349025</span>
</span></span></code></pre></div><p>I recommend executing this program multiple times as <code>channel1</code> and <code>channel2</code> will receive values at the same time and the output will be chosen at random by <code>select</code>.</p>
<h2 id="timeouts-using-timeafter">Timeouts using <code>time.After()</code></h2>
<p>The <code>time.After()</code> function returns a value after the time specified in its parameter. It could be used as a timeout <code>case</code> in <code>select</code> statements.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">sendOnChannel</span><span class="p">(</span><span class="nx">doneFlag</span> <span class="kd">chan</span><span class="o">&lt;-</span> <span class="kt">bool</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// It will take at least 5 seconds for this function to finish</span>
</span></span><span class="line"><span class="cl">	<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">doneFlag</span><span class="o">&lt;-</span><span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">channel1</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">channel2</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="nf">sendOnChannel</span><span class="p">(</span><span class="nx">channel1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="nf">sendOnChannel</span><span class="p">(</span><span class="nx">channel2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">select</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="o">&lt;-</span><span class="nx">channel1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Channel 1 has responded&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="o">&lt;-</span><span class="nx">channel2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Channel 2 has responded&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Added a 2 seconds timeout in the select statement</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="o">&lt;-</span><span class="nx">time</span><span class="p">.</span><span class="nf">After</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">2</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;You&#39;ve hit a timeout&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// You&#39;ve hit a timeout</span>
</span></span></code></pre></div><h1 id="non-blocking-channel-operations-with-default">Non-Blocking Channel Operations with <code>default</code></h1>
<p>A <code>default</code> statement is defined in <code>select</code> to avoid blocking from unbuffered channels.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">channel1</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">select</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">case</span> <span class="o">&lt;-</span><span class="nx">channel1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Something received on channel1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Since there is no value received on channel1</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// the default case will be executed</span>
</span></span><span class="line"><span class="cl">	<span class="k">default</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;This is default statement&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;No value was received on channel1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// This is default statement</span>
</span></span><span class="line"><span class="cl"><span class="c1">// No value was received on channel1</span>
</span></span></code></pre></div><h1 id="closing-channels">Closing Channels</h1>
<p>We can <code>close()</code> a channel to stop it from accepting further values.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">valueChannel</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">int</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="kd">func</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="p">&lt;</span><span class="mi">5</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Sending&#34;</span><span class="p">,</span><span class="nx">i</span><span class="p">,</span><span class="s">&#34;to channel valueChannel&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nx">valueChannel</span> <span class="o">&lt;-</span> <span class="nx">i</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">		<span class="c1">// Closing valueChannel to stop it from receiving further values</span>
</span></span><span class="line"><span class="cl">		<span class="nb">close</span><span class="p">(</span><span class="nx">valueChannel</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="kd">func</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">value</span><span class="p">,</span> <span class="nx">openFlag</span> <span class="o">:=</span> <span class="o">&lt;-</span> <span class="nx">valueChannel</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="p">!</span><span class="nx">openFlag</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;valueChannel is closed&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Received value:&#34;</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="o">&lt;-</span><span class="nx">valueChannel</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;All values received&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Main Goroutine finished&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sending 0 to channel valueChannel</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sending 1 to channel valueChannel</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sending 2 to channel valueChannel</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Received value: 1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Received value: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sending 3 to channel valueChannel</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sending 4 to channel valueChannel</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Received value: 3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Received value: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// valueChannel is closed</span>
</span></span><span class="line"><span class="cl"><span class="c1">// All values received</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Main Goroutine finished</span>
</span></span></code></pre></div><h1 id="waitgroups">WaitGroups</h1>
<p>By default a Go program is finished when the <code>main</code> Goroutine is completed, We can add statements that wait for receiving over a channel like <code>&lt;-done</code> once all goroutines are finished.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;math/rand&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">fastRoutine</span><span class="p">(</span><span class="nx">done</span> <span class="kd">chan</span> <span class="kt">bool</span><span class="p">)(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// It will take at least 2 seconds to execute this function</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Fast Routine started&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">done</span> <span class="o">&lt;-</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Int</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">slowRoutine</span><span class="p">(</span><span class="nx">done</span> <span class="kd">chan</span> <span class="kt">bool</span><span class="p">)(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// It will take at least 5 seconds to execute this function</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Slow Routine started&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">done</span> <span class="o">&lt;-</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Int</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">done</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">done2</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="kd">func</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fastRandomVal</span> <span class="o">:=</span> <span class="nf">fastRoutine</span><span class="p">(</span><span class="nx">done</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value received from fast routine:&#34;</span><span class="p">,</span> <span class="nx">fastRandomVal</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="kd">func</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">slowRandomVal</span> <span class="o">:=</span> <span class="nf">slowRoutine</span><span class="p">(</span><span class="nx">done2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value received from slow routine:&#34;</span><span class="p">,</span> <span class="nx">slowRandomVal</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="o">&lt;-</span><span class="nx">done</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;-</span><span class="nx">done2</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Slow Routine started</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Fast Routine started</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value received from fast routine: 1556543771289280615</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value received from slow routine: 2312691093026658070</span>
</span></span></code></pre></div><p>But <code>sync.WaitGroup</code> provides a much more elegant way to monitor multiple Goroutines at once.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;sync&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;math/rand&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;time&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">fastRoutine</span><span class="p">()(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Fast Routine started&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Int</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">slowRoutine</span><span class="p">()(</span><span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Slow Routine started&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="o">*</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">rand</span><span class="p">.</span><span class="nf">Int</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Created a WaitGroup</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">wg</span> <span class="nx">sync</span><span class="p">.</span><span class="nx">WaitGroup</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Incrementing WaitGroup counter by 1</span>
</span></span><span class="line"><span class="cl">	<span class="nx">wg</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="kd">func</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// Decrement WaitGroup counter by 1 </span>
</span></span><span class="line"><span class="cl">		<span class="c1">// after the goroutine is finished</span>
</span></span><span class="line"><span class="cl">		<span class="k">defer</span> <span class="nx">wg</span><span class="p">.</span><span class="nf">Done</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fastRandomVal</span> <span class="o">:=</span> <span class="nf">fastRoutine</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value received from fast routine:&#34;</span><span class="p">,</span> <span class="nx">fastRandomVal</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">wg</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">go</span> <span class="kd">func</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="k">defer</span> <span class="nx">wg</span><span class="p">.</span><span class="nf">Done</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="nx">slowRandomVal</span> <span class="o">:=</span> <span class="nf">slowRoutine</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value received from slow routine:&#34;</span><span class="p">,</span> <span class="nx">slowRandomVal</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Wait for the WaitGroup counter to reach 0</span>
</span></span><span class="line"><span class="cl">	<span class="nx">wg</span><span class="p">.</span><span class="nf">Wait</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Slow Routine started</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Fast Routine started</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value received from fast routine: 4966166931659874487</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value received from slow routine: 439978995889306642</span>
</span></span></code></pre></div><p><code>WaitGroup</code> starts a counter at <code>0</code> and a delta (<code>int</code> value) is added to it using the <code>Add()</code> method. The <code>Done()</code> method decrements the counter by <code>1</code> and the <code>Wait()</code> method waits for the counter to reach <code>0</code> and moves to the next statements in the program.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://freecontent.manning.com/concurrency-vs-parallelism/" target="_blank">Concurrency vs Parallelism</a><br>
<a href="https://youtu.be/oV9rvDllKEg" target="_blank">Concurrency is not Parallelism</a><br>
<a href="https://go.dev/talks/2012/waza.slide#29" target="_blank">[Slides] Concurrency is not Parallelism</a><br>
<a href="https://pkg.go.dev/github.com/eapache/channels" target="_blank">channels</a><br>
<a href="https://pkg.go.dev/sync#WaitGroup" target="_blank">WaitGroup</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>File Handling in Go</title>
      <link>http://www.avni.sh/posts/go/file-handling-in-go/</link>
      <pubDate>Tue, 27 Jun 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/go/file-handling-in-go/</guid>
      <description>The os package in Go provides data structures, functions, and methods for managing files and directories</description>
      <content:encoded><![CDATA[<p>Reading and writing files is one of the most common tasks in programming projects. Using this skill we can store data persistently and decrease the memory consumption of our program.</p>
<h1 id="paths">Paths</h1>
<p>The <code>path/filepath</code> package provides <code>filepath.Join()</code> function to create filesystem paths for files and directories. The same could also be achieved with string concatenation in Go but it won&rsquo;t be interoperable between different operating systems (Linux uses the forward slash (<code>/</code>) for separators in the path whereas Windows uses the backward slash (<code>\</code>)).</p>
<p>Other functions provided by the <code>path/filepath</code> package:</p>
<ul>
<li><code>filepath.Dir()</code>: Returns the directory from the path (excluding filename).</li>
<li><code>filepath.Base()</code>: Returns the filename from the path (excluding parent directories).</li>
<li><code>filepath.Ext()</code>: Returns the extension of the file.</li>
<li><code>filepath.IsAbs()</code>: Returns <code>true</code> if the <code>filepath</code> is an absolute path otherwise <code>false</code>.</li>
<li><code>filepath.Rel()</code>: Returns relative path between its two argument paths.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;path/filepath&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile</span> <span class="o">:=</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Join</span><span class="p">(</span><span class="s">&#34;/app&#34;</span><span class="p">,</span> <span class="s">&#34;file_handling.go&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example File Path:&#34;</span><span class="p">,</span> <span class="nx">exampleFile</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Filename:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Base</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Directory:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Dir</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Extension in Filename:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Ext</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Is exampleFile path absolute?:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">IsAbs</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">value</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Rel</span><span class="p">(</span><span class="s">&#34;/tmp&#34;</span><span class="p">,</span> <span class="nx">exampleFile</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Relative path between /tmp and exampleFile will be:&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">				<span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example File Path: /app/file_handling.go</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Filename: file_handling.go</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Directory: /app</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Extension in Filename: .go</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Is exampleFile path absolute?: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Relative path between /tmp and exampleFile will be: ../app/file_handling.go</span>
</span></span></code></pre></div><h1 id="defer-keyword"><code>defer</code> Keyword</h1>
<p>When a file is opened by a program its contents are loaded on the system memory. That&rsquo;s why it is crucial to close the file and release the occupied memory. This will also prevent data corruption on the file.</p>
<p>Any statement in Go prefixed with <code>defer</code> keyword will be executed at the end of the parent function. These statements are generally used for cleanup tasks.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">testFunc</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;This will be executed after testFunc() has ended&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;This is the last statement in testFunc()&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;This will be executed after main() has ended&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">testFunc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Last statement in main()&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// This is the last statement in testFunc()</span>
</span></span><span class="line"><span class="cl"><span class="c1">// This will be executed after testFunc() has ended</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Last statement in main()</span>
</span></span><span class="line"><span class="cl"><span class="c1">// This will be executed after main() has ended</span>
</span></span></code></pre></div><p>We can define the functions for closing files &amp; perform other resource cleanup, then call them with <code>defer</code> keyword to ensure they are executed after our program has finished. The statements will be executed in the reverse order of their declaration.</p>
<h1 id="managing-directories">Managing Directories</h1>
<p>The <code>os</code> package in Go provides functions analogous to common Linux/Windows commands used for managing directories.</p>
<ul>
<li><code>os.Mkdir()</code>: Similar to the <code>mkdir</code> Linux command, it creates the directory given the filepath in string and the octal notation of directory permissions (like <code>0755</code>).</li>
<li><code>os.MkdirAll()</code>: Creates the complete hierarchy of directories similar to the <code>mkdir</code> command executed with <code>--parents</code> or <code>-p</code> flag.</li>
<li><code>os.RemoveAll()</code>: Removes directory (including subfolders and files).</li>
<li><code>os.Getwd()</code>: Returns the present working directory similar to the <code>pwd</code> command.</li>
<li><code>os.Chdir()</code>: Changes present working directory. Same as the <code>cd</code> command.</li>
<li><code>os.ReadDir()</code>: <code>ls</code> command in Linux lists the contents of the current directory, <code>os.ReadDir()</code> will do the same for the directory path passed as the argument. A <code>for</code> loop has to be defined on the slice returned by the function to access each file/directory with its name.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">removeDir</span><span class="p">(</span><span class="nx">dirPath</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">RemoveAll</span><span class="p">(</span><span class="nx">dirPath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">dirPath</span><span class="p">,</span> <span class="s">&#34;removed&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">getPWD</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">pwd</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Getwd</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Present Working Directory is:&#34;</span><span class="p">,</span> <span class="nx">pwd</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Creating temp directory&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Mkdir</span><span class="p">(</span><span class="s">&#34;temp&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Creating temp2/temp3/testDir directory hierarchy&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">MkdirAll</span><span class="p">(</span><span class="s">&#34;temp2/temp3/testDir&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Mkdir</span><span class="p">(</span><span class="s">&#34;temp2/temp4&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Mkdir</span><span class="p">(</span><span class="s">&#34;temp2/temp5&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// This will be executed after the main() function is finished</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nf">removeDir</span><span class="p">(</span><span class="s">&#34;temp&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nf">removeDir</span><span class="p">(</span><span class="s">&#34;temp2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">val</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadDir</span><span class="p">(</span><span class="s">&#34;temp2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Contents of temp2 directory:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">file</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">val</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;\t&#34;</span><span class="p">,</span><span class="nx">file</span><span class="p">.</span><span class="nf">Name</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;\n&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nf">getPWD</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Moving one level up&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Chdir</span><span class="p">(</span><span class="s">&#34;../&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">getPWD</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Moving back to /app directory&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Chdir</span><span class="p">(</span><span class="s">&#34;/app&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">getPWD</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Creating temp directory</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Creating temp2/temp3/testDir directory hierarchy</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Contents of temp2 directory:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         temp3   temp4   temp5</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Present Working Directory is: /app</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Moving one level up</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Present Working Directory is: /</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Moving back to /app directory</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Present Working Directory is: /app</span>
</span></span><span class="line"><span class="cl"><span class="c1">// temp2 removed</span>
</span></span><span class="line"><span class="cl"><span class="c1">// temp removed</span>
</span></span></code></pre></div><h1 id="reading-from-a-file">Reading from a File</h1>
<p>The <code>os.ReadFile()</code> function will load the entire content of a file into the system memory. If we want to save memory or read specific portions of a file we can use <code>os.Open()</code> function. It returns an instance of  <code>os.File</code> struct that could be used for navigating the file in read-only mode.</p>
<p>The <code>os.Seek()</code> method will offset all read and write operations to a specific location in an <code>os.File</code> instance. For example <code>exampleFile.Seek(10, 0)</code> will increase the offset by 10 bytes. Hence, all the read and write operations performed on the <code>exampleFile</code> will skip the first 10 bytes. The second argument in <code>os.Seek()</code> signifies the origin relative to the offset i.e.</p>
<ul>
<li><code>exampleFile.Seek(10, 0)</code>: 10 bytes from the start of the file</li>
<li><code>exampleFile.Seek(10, 1)</code>: 10 bytes from the current offset location</li>
<li><code>exampleFile.Seek(10, 2)</code>: 10 bytes from the end of the file</li>
</ul>
<p><code>exampleFile.Seek(0, 0)</code> will reset the offset to 0 (start of the file).</p>
<p>The <code>os.Read()</code> method is used to read the contents of a file in a byte slice. It returns the number of bytes read as a value. In the following example, we will perform read operations on <code>example.txt</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ cat example.txt
</span></span><span class="line"><span class="cl">Hello, World
</span></span><span class="line"><span class="cl"><span class="m">42</span> is the meaning of life, the universe, and everything
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reading the complete example.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;example.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Content from example.txt:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// Converting the byte slice returned by ReadFile to string</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile2</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="s">&#34;example.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">exampleFile2</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Offsetting operations 13 bytes from the start</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile2</span><span class="p">.</span><span class="nf">Seek</span><span class="p">(</span><span class="mi">13</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">byteArr</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="mi">17</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">numBytes</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">exampleFile2</span><span class="p">.</span><span class="nf">Read</span><span class="p">(</span><span class="nx">byteArr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Bytes read from exampleFile2:&#34;</span><span class="p">,</span> <span class="nx">numBytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%v\n&#34;</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">byteArr</span><span class="p">[:</span><span class="nx">numBytes</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reading the complete example.txt</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Content from example.txt:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello, World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 42 is the meaning of life, the universe, and everything</span>
</span></span><span class="line"><span class="cl"><span class="c1">// </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Bytes read from exampleFile2: 17</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 42 is the meaning</span>
</span></span></code></pre></div><h1 id="writing-to-a-file">Writing to a File</h1>
<p>The <code>os.Create()</code> function will create a file or directory from the string path passed as its argument.</p>
<p>Similar to <code>os.ReadFile()</code>, the <code>os.WriteFile()</code> function will write the contents of a byte slice to the given file. It will also create the file if it doesn&rsquo;t exist. To perform more granular writes we have <code>os.Write()</code> method.</p>
<p>To open a file for read-write operations we have to use <code>os.OpenFile()</code> instead of <code>os.Open()</code>, with <code>os.O_RDWR</code> as its argument. The changes written to the file by the program will not reflect on the system storage until the <code>os.Sync()</code> method is called.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">readFile</span><span class="p">(</span><span class="nx">filepath</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reading the contents of&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">byteSlice</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="nx">filepath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">byteSlice</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Writing to hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">byteSlice</span> <span class="o">:=</span> <span class="p">[]</span><span class="nb">byte</span><span class="p">(</span><span class="s">&#34;Hello from Go program\n&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">WriteFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">,</span> <span class="nx">byteSlice</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Write successful&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">readFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">helloFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">helloFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Moving offset to the end of file</span>
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">helloFile</span><span class="p">.</span><span class="nf">Seek</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">byteSliceWrite</span> <span class="o">:=</span> <span class="s">&#34;Hey from WriteFile&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">helloFile</span><span class="p">.</span><span class="nf">WriteString</span><span class="p">(</span><span class="nx">byteSliceWrite</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">readFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Syncing changes between memory and storage</span>
</span></span><span class="line"><span class="cl">	<span class="nx">helloFile</span><span class="p">.</span><span class="nf">Sync</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Writing to hello.txt</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Write successful</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reading the contents of hello.txt :</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from Go program</span>
</span></span><span class="line"><span class="cl"><span class="c1">//</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reading the contents of hello.txt :</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from Go program</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hey from WriteFile</span>
</span></span></code></pre></div><h1 id="handling-common-filetypes">Handling Common Filetypes</h1>
<p>JSON, YAML, and XML are one of the most common file types for configuration, test results, and other structured data storage.</p>
<h2 id="json">JSON</h2>
<h3 id="encoding-json">Encoding JSON</h3>
<p>Encoding is the process of converting data into a specific format. To encode data into JSON format we have to use the <code>encoding/json</code> package.</p>
<p>The <code>json.Marshal()</code> function returns the JSON encoding for the struct instance passed as its argument. The fields in struct need to have their first character capitalized.</p>
<p>The Marshal-ed JSON could be written to file with the help of <code>os.OpenFile()</code> and <code>os.Write()</code> functions.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">v</span> <span class="o">:=</span> <span class="nx">Vehicle</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">&#34;Nissan GTR&#34;</span><span class="p">,</span> <span class="nx">Color</span><span class="p">:</span> <span class="s">&#34;Grey&#34;</span><span class="p">,</span> <span class="nx">NumWheels</span><span class="p">:</span> <span class="mi">4</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle instance:&#34;</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">jsonData</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">(</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle JSON:\n&#34;</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">jsonData</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">file</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;vehicle.json&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_CREATE</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">file</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">file</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="nx">jsonData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">file</span><span class="p">.</span><span class="nf">Sync</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle instance: {Nissan GTR Grey 4}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle JSON:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  {&#34;Name&#34;:&#34;Nissan GTR&#34;,&#34;Color&#34;:&#34;Grey&#34;,&#34;NumWheels&#34;:4}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">$ cat vehicle.json 
</span></span><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;Name&#34;</span>:<span class="s2">&#34;Nissan GTR&#34;</span>,<span class="s2">&#34;Color&#34;</span>:<span class="s2">&#34;Grey&#34;</span>,<span class="s2">&#34;NumWheels&#34;</span>:4<span class="o">}</span>
</span></span></code></pre></div><h3 id="decoding-json">Decoding JSON</h3>
<p>Decoding is the reverse of encoding, we take data from a specified format and convert it to its original form. The <code>json</code> Go package provides <code>json.Unmarshal()</code> function for decoding JSON into a struct.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">v</span> <span class="nx">Vehicle</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">jsonFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;vehicle.json&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">jsonFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="p">=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">jsonFile</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Struct Instance from JSON:&#34;</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Struct Instance from JSON: {Nissan GTR Grey 4}</span>
</span></span></code></pre></div><h2 id="yaml">YAML</h2>
<p>Similar to the <code>json</code> package, <code>gopkg.in/yaml</code> also provides <code>yaml.Marshal()</code> and <code>yaml.Unmarshal()</code> functions for encoding and decoding data into YAML respectively.</p>
<p>Before using the <code>gopkg.in/yaml</code> package we have to install it with the <code>go get</code> command.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go get gopkg.in/yaml.v2
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;gopkg.in/yaml.v2&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">VehicleUses</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">F1SafetyCar</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Uses</span> <span class="nx">VehicleUses</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Writing an instance of Vehicle to vehicle.yaml</span>
</span></span><span class="line"><span class="cl">	<span class="nx">v</span> <span class="o">:=</span> <span class="nx">Vehicle</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span><span class="p">:</span><span class="s">&#34;Aston Martin Vantage&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span><span class="p">:</span> <span class="s">&#34;green&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span><span class="p">:</span><span class="mi">4</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">Uses</span><span class="p">:</span><span class="nx">VehicleUses</span><span class="p">{</span><span class="nx">F1SafetyCar</span><span class="p">:</span> <span class="kc">true</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle Instance:&#34;</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">yamlData</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">yaml</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle in YAML format:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">yamlData</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">yamlFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;vehicle.yaml&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_CREATE</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">yamlFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s">&#34;vehicle.yaml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">yamlFile</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="nx">yamlData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Creating an instance of Vehicle from vehicle.yaml</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">v2</span> <span class="nx">Vehicle</span>
</span></span><span class="line"><span class="cl">	<span class="nx">yamlFile2</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;vehicle.yaml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="p">=</span> <span class="nx">yaml</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">yamlFile2</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">v2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Instance of Vehicle from vehicle.yaml:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">v2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle Instance: {Aston Martin Vantage green 4 {true}}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle in YAML format:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// name: Aston Martin Vantage</span>
</span></span><span class="line"><span class="cl"><span class="c1">// color: green</span>
</span></span><span class="line"><span class="cl"><span class="c1">// numwheels: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// uses:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//   f1safetycar: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">//</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Instance of Vehicle from vehicle.yaml:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// {Aston Martin Vantage green 4 {true}}</span>
</span></span></code></pre></div><h2 id="xml">XML</h2>
<p>The XML format is commonly used to store test results and configuration. The <code>encoding/xml</code> Go package provides <code>xml.Marshal()</code> and <code>xml.Unmarshal()</code> functions.</p>
<p>If we want the data in a prettified format (with indents on each level) then we can use the <code>xml.MarshalIndent()</code> function. <code>MarshalIndent()</code> is also present in <code>json</code> and <code>gopkg.in/yaml</code> packages.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;encoding/xml&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Student</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">IdNum</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Subjects</span> <span class="p">[]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Storing an instance of Student in XML format</span>
</span></span><span class="line"><span class="cl">	<span class="nx">student1</span> <span class="o">:=</span> <span class="nx">Student</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span><span class="p">:</span> <span class="s">&#34;John Doe&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">IdNum</span><span class="p">:</span> <span class="mi">98</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">Subjects</span><span class="p">:[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;English&#34;</span><span class="p">,</span> <span class="s">&#34;Maths&#34;</span><span class="p">,</span> <span class="s">&#34;Science&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of a Student instance:&#34;</span><span class="p">,</span> <span class="nx">student1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">xmlFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;student.xml&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_CREATE</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">xmlFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s">&#34;student.xml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">xmlData</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">xml</span><span class="p">.</span><span class="nf">MarshalIndent</span><span class="p">(</span><span class="nx">student1</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">,</span> <span class="s">&#34;	&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Student data in XML format:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">xmlData</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">xmlFile</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="nx">xmlData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Reading an instance of Student from XML File</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">student2</span> <span class="nx">Student</span>
</span></span><span class="line"><span class="cl">	<span class="nx">xmlFile2</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;student.xml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="p">=</span> <span class="nx">xml</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">xmlFile2</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">student2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Student from student.xml:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">student2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of a Student instance: {John Doe 98 [English Maths Science]}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Student data in XML format:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  &lt;Student&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Name&gt;John Doe&lt;/Name&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;IdNum&gt;98&lt;/IdNum&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Subjects&gt;English&lt;/Subjects&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Subjects&gt;Maths&lt;/Subjects&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Subjects&gt;Science&lt;/Subjects&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  &lt;/Student&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Student from student.xml:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// {John Doe 98 [English Maths Science]}</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://gobyexample.com/" target="_blank">Go by Example</a><br>
<a href="https://go.dev/blog/json" target="_blank">JSON and Go</a><br>
<a href="https://pkg.go.dev/encoding/json" target="_blank">encoding/json</a><br>
<a href="https://github.com/go-yaml/yaml" target="_blank">go-yaml/yaml</a><br>
<a href="https://pkg.go.dev/gopkg.in/yaml.v2" target="_blank">gopkg.in/yaml.v2</a><br>
<a href="https://pkg.go.dev/encoding/xml" target="_blank">encoding/xml</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Go Programming Language</title>
      <link>http://www.avni.sh/posts/go/go-programming-language/</link>
      <pubDate>Wed, 21 Jun 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/go/go-programming-language/</guid>
      <description>Go is used to build applications for cloud, network services, and web development.</description>
      <content:encoded><![CDATA[<p>Go is a compiled language developed by Robert Griesemer, Rob Pike, and Ken Thompson at Google. It is primarily used in cloud-native and web development projects.</p>
<p>Some of the popular projects created with Go</p>
<ul>
<li>Docker: Container Engine</li>
<li>Kubernetes: Container Orchestrator</li>
<li>Hugo: Static Site Generator (Also used to generate this blog)</li>
<li><a href="/posts/computer-science/technologies/cloud-native/helm-charts" target="_blank">Helm</a>: Package manager for Kubernetes</li>
</ul>
<h1 id="packages">Packages</h1>
<p>A <strong>Package</strong> abstraction is created in Go to group functions that are related to each other or associated with a specific task. At the start of each source file (<code>*.go</code>) a package name is assigned to it using the <code>package</code> keyword, for example, <code>package main</code>.</p>
<p>To import a package we use the <code>import</code> keyword with the name of the package enclosed in <code>&quot;&quot;</code> like <code>import &quot;fmt&quot;</code>. The constants, functions, and variables imported from a package are referred to with their first letter capitalized like <code>math.Pi</code> and <code>math.Pow()</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Packages could be bundled together as <strong>modules</strong>. The <code>go.mod</code> file declares the path to a Go module and all packages within it. A Go module is initialized using the <code>go mod init</code> command followed by the name of the module</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">go mod init exampleModule
</span></span></code></pre></div><p>This will generate a <code>go.mod</code> file in the directory specifying the name of the module (<code>exampleModule</code>) and its dependencies.</p>
<h1 id="standard-input-and-output">Standard Input and Output</h1>
<p>The <code>fmt</code> package provides functions for standard input and output,  these help return output from the program and take inputs from the user respectively. The <code>fmt.Println()</code> function outputs its arguments to the terminal and <code>fmt.Scanln()</code> takes input from the terminal and assigns them to variables. Variations of <code>Println</code> and <code>Scanln</code> provided by <code>fmt</code>:</p>
<ul>
<li><code>fmt.Print()</code>: Standard output without any newline at the end.</li>
<li><code>fmt.Scan()</code>: Values are read from standard input and the newline is interpreted as space.</li>
<li><code>fmt.Printf()</code>: Standard output in the specified format.</li>
<li><code>fmt.Scanf()</code>: Reads the value from the terminal in the specified format.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;Your name:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Hello&#34;</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Your name: Joe</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello Joe</span>
</span></span></code></pre></div><h1 id="building-and-executing">Building and Executing</h1>
<p>To compile and build a Go package as a binary we use the <code>go build</code> command.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">go build hello.go
</span></span></code></pre></div><p>This will create a binary named <code>hello</code> (or <code>hello.exe</code> in Windows) in the current directory that could be executed directly by the host OS.</p>
<p>We can execute a Go package directly from the source file using the <code>go run</code> command.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">go run hello.go
</span></span></code></pre></div><h1 id="constants">Constants</h1>
<p><code>const</code> keyword is used to define constants, values that don&rsquo;t have to be changed throughout the program. Go supports numeric, character, string, and boolean constants.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">const</span> <span class="nx">pi</span> <span class="p">=</span> <span class="mf">3.14</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Approximate value of Pi is:&#34;</span><span class="p">,</span> <span class="nx">pi</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Approximate value of Pi is: 3.14</span>
</span></span></code></pre></div><h1 id="variables-and-datatypes">Variables and Datatypes</h1>
<p>To initialize a variable in Go we have to use the <code>var</code> keyword followed by the name of the variable and its datatype like <code>var intExample int</code>.</p>
<p>Go has the following datatypes</p>
<ul>
<li><code>bool</code> for boolean values. Either <code>true</code> or <code>false</code>.</li>
<li><code>string</code> for storing single or multiple characters.</li>
<li><code>rune</code> for storing the Unicode code point of a character.</li>
<li><code>int</code> for integers. Go also supports <code>int8</code>, <code>int16</code>, <code>int32</code>, and <code>int64</code> where the digits after <code>int</code> signifies the number of bits required to represent the value.</li>
<li><code>uint</code> for unsigned integers (integers without + or -). <code>uint8</code>/<code>byte</code>, <code>uint16</code>, <code>uint32</code>, <code>uint64</code> are also available in Go.</li>
<li>Variables of the <code>uintptr</code> type are used to store integer representations of memory addresses. They are useful for performing pointer arithmetic provided by <code>unsafe.Pointer</code>.</li>
<li><code>float32</code> and <code>float64</code> for values that require decimal precision.</li>
<li><code>complex64</code> and <code>complex128</code> are used to represent 64 and 128-bit complex numbers like $5\ +\ i6$ (where $i$ represents $\sqrt{(-1)}$)</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">intExample</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">        <span class="nx">intExample</span> <span class="p">=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Integer Example:&#34;</span><span class="p">,</span> <span class="nx">intExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">floatExample</span> <span class="kt">float64</span>
</span></span><span class="line"><span class="cl">        <span class="nx">floatExample</span> <span class="p">=</span> <span class="mf">2.3</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Float Example:&#34;</span><span class="p">,</span> <span class="nx">floatExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">stringExample</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">        <span class="nx">stringExample</span> <span class="p">=</span> <span class="s">&#34;Hello, World&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;String Example:&#34;</span><span class="p">,</span> <span class="nx">stringExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">boolExample</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl">        <span class="nx">boolExample</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Boolean Example:&#34;</span><span class="p">,</span> <span class="nx">boolExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">complexExample</span> <span class="kt">complex64</span>
</span></span><span class="line"><span class="cl">        <span class="nx">complexExample</span> <span class="p">=</span> <span class="nb">complex</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Complex Number Example:&#34;</span><span class="p">,</span> <span class="nx">complexExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Integer Example: 3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Float Example: 2.3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// String Example: Hello, World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Boolean Example: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Complex Number Example: (5+6i)</span>
</span></span></code></pre></div><p>To declare and assign values to a variable without explicitly specifying its datatype we use <code>:=</code> operand, the variable&rsquo;s datatype will be inferred during compile time by the value on the right side of the operand.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">intExample</span> <span class="o">:=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Integer Example:&#34;</span><span class="p">,</span> <span class="nx">intExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">floatExample</span> <span class="o">:=</span> <span class="mf">2.3</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Float Example:&#34;</span><span class="p">,</span> <span class="nx">floatExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">stringExample</span> <span class="o">:=</span> <span class="s">&#34;Hello, World&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;String Example:&#34;</span><span class="p">,</span> <span class="nx">stringExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">boolExample</span> <span class="o">:=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Boolean Example:&#34;</span><span class="p">,</span> <span class="nx">boolExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">complexExample</span> <span class="o">:=</span> <span class="nb">complex</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Complex Number Example:&#34;</span><span class="p">,</span> <span class="nx">complexExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Integer Example: 3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Float Example: 2.3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// String Example: Hello, World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Boolean Example: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Complex Number Example: (5+6i)</span>
</span></span></code></pre></div><p>If a variable is initialized without any value then a <em>zero</em> value will be assigned to it by default. Zero values for different datatypes are <code>0</code> (for <code>int</code>), <code>0.0</code> (for <code>float64</code>), <code>&quot;&quot;</code> (for <code>string</code>), and <code>false</code> (for <code>bool</code>).</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">example1</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">example1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">example2</span> <span class="kt">float64</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">example2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">example3</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">example3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">example4</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">example4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 0</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 0</span>
</span></span><span class="line"><span class="cl"><span class="c1">// </span>
</span></span><span class="line"><span class="cl"><span class="c1">// false</span>
</span></span></code></pre></div><h1 id="type-conversion">Type Conversion</h1>
<p>Datatypes could also be used as functions for type conversion of variables for example <code>float64(intExample)</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">intExample</span> <span class="o">:=</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Float conversion of intExample: %0.2f&#34;</span><span class="p">,</span> <span class="nb">float64</span><span class="p">(</span><span class="nx">intExample</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Float conversion of intExample: 4.00</span>
</span></span></code></pre></div><h1 id="functions">Functions</h1>
<p><strong>Functions</strong> allow us to aggregate frequently used instructions as a single statement. To define a function in Go we use the <code>func</code> keyword followed by the name of the function, its arguments (inputs), and the datatype of the return values like <code>func exampleFunc (inputValue int) (outputValue int) { }</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">square</span> <span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nx">x</span><span class="o">*</span><span class="nx">x</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">sumAndDifference</span> <span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">,</span> <span class="nx">y</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nx">x</span><span class="o">+</span><span class="nx">y</span><span class="p">,</span> <span class="nx">x</span><span class="o">-</span><span class="nx">y</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">value1</span> <span class="o">:=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Square of&#34;</span><span class="p">,</span> <span class="nx">value1</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nf">square</span><span class="p">(</span><span class="nx">value1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nx">value2</span> <span class="o">:=</span> <span class="mi">8</span>
</span></span><span class="line"><span class="cl">        <span class="nx">sum</span><span class="p">,</span> <span class="nx">difference</span> <span class="o">:=</span> <span class="nf">sumAndDifference</span><span class="p">(</span><span class="nx">value1</span><span class="p">,</span> <span class="nx">value2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Sum of&#34;</span><span class="p">,</span> <span class="nx">value1</span><span class="p">,</span> <span class="s">&#34;and&#34;</span><span class="p">,</span> <span class="nx">value2</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nx">sum</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Difference of&#34;</span><span class="p">,</span> <span class="nx">value2</span><span class="p">,</span> <span class="s">&#34;from&#34;</span><span class="p">,</span> <span class="nx">value1</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nx">difference</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Square of 5 is: 25</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Sum of 5 and 8 is: 13</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Difference of 8 from 5 is: -3</span>
</span></span></code></pre></div><h2 id="anonymous-functions">Anonymous Functions</h2>
<p>Functions are first-class citizens in Go i.e. they could be defined inside variables, passed as arguments, and returned as values from other functions.</p>
<p>Functions with no name (called <strong>Anonymous functions</strong>) could be created to perform a set of instructions once in a program.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Anonymous Function</span>
</span></span><span class="line"><span class="cl">	<span class="kd">func</span> <span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Hello, this is not a random number:&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Function as Variable</span>
</span></span><span class="line"><span class="cl">	<span class="nx">funcExample</span> <span class="o">:=</span> <span class="kd">func</span> <span class="p">(</span><span class="nx">x</span> <span class="kt">int</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example Function&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Input:&#34;</span><span class="p">,</span> <span class="nx">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">funcExample</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello, this is not a random number: 1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example Function</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Input: 3</span>
</span></span></code></pre></div><h1 id="conditions">Conditions</h1>
<p>Go supports <code>if</code>, <code>else if</code>,  and <code>else</code> for defining conditional statements.<code>&amp;&amp;</code> (AND) and <code>||</code> (OR) operators could be used to create complex conditional expressions.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">evaluateGrades</span> <span class="p">(</span><span class="nx">marks</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">string</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">marks</span> <span class="p">&lt;</span> <span class="mi">101</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    	<span class="k">if</span> <span class="nx">marks</span> <span class="p">&lt;</span> <span class="mi">40</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    		<span class="k">return</span> <span class="s">&#34;D&#34;</span>
</span></span><span class="line"><span class="cl">    	<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">marks</span> <span class="o">&gt;=</span> <span class="mi">40</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    		<span class="k">return</span> <span class="s">&#34;C&#34;</span>
</span></span><span class="line"><span class="cl">    	<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="nx">marks</span> <span class="o">&gt;=</span> <span class="mi">50</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    		<span class="k">return</span> <span class="s">&#34;B&#34;</span>
</span></span><span class="line"><span class="cl">    	<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">marks</span> <span class="o">&gt;=</span> <span class="mi">60</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    		<span class="k">return</span> <span class="s">&#34;A&#34;</span>
</span></span><span class="line"><span class="cl">    	<span class="p">}</span> 
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s">&#34;INVALID&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">marks</span> <span class="o">:=</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Grade for marks:&#34;</span><span class="p">,</span> <span class="nx">marks</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nf">evaluateGrades</span><span class="p">(</span><span class="nx">marks</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nx">marks</span> <span class="p">=</span> <span class="mi">40</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Grade for marks:&#34;</span><span class="p">,</span> <span class="nx">marks</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nf">evaluateGrades</span><span class="p">(</span><span class="nx">marks</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">marks</span> <span class="p">=</span> <span class="mi">51</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Grade for marks:&#34;</span><span class="p">,</span> <span class="nx">marks</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nf">evaluateGrades</span><span class="p">(</span><span class="nx">marks</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">marks</span> <span class="p">=</span> <span class="mi">101</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Grade for marks:&#34;</span><span class="p">,</span> <span class="nx">marks</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span> <span class="nf">evaluateGrades</span><span class="p">(</span><span class="nx">marks</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Grade for marks: 4 is: D</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Grade for marks: 40 is: C</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Grade for marks: 51 is: C</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Grade for marks: 101 is: INVALID</span>
</span></span></code></pre></div><h1 id="switch-cases">Switch Cases</h1>
<p>Sometimes a <code>switch</code> could be relatively clean compared to multiple <code>if</code> and <code>else if</code> statements.</p>
<p>Unlike <code>if-else</code> the first <code>case</code> which satisfies the condition will be executed and the following cases will be ignored. If none of the <code>case</code> conditions are satisfied then the <code>default</code> statement is executed.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">evaluate</span> <span class="p">(</span><span class="nx">value1</span><span class="p">,</span> <span class="nx">value2</span><span class="p">,</span> <span class="nx">operation</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">switch</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">case</span> <span class="nx">operation</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="nx">value1</span><span class="o">+</span><span class="nx">value2</span>
</span></span><span class="line"><span class="cl">        <span class="k">case</span> <span class="nx">operation</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="nx">value1</span><span class="o">-</span><span class="nx">value2</span>
</span></span><span class="line"><span class="cl">        <span class="k">case</span> <span class="nx">operation</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="nx">value1</span><span class="o">*</span><span class="nx">value2</span>
</span></span><span class="line"><span class="cl">        <span class="k">case</span> <span class="nx">operation</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="nx">value1</span><span class="o">/</span><span class="nx">value2</span>
</span></span><span class="line"><span class="cl">        <span class="k">default</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">value1</span><span class="p">,</span> <span class="nx">value2</span><span class="p">,</span> <span class="nx">operation</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Calculator Program:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;Enter value1:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">value1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;Enter value2:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">value2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;\nSelect Operation to Perform&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;1) ADD&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;2) SUBTRACT&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;3) MULTIPLY&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;4) DIVIDE&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;Enter the operation number:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">operation</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Result of Operation is:&#34;</span><span class="p">,</span> <span class="nf">evaluate</span><span class="p">(</span><span class="nx">value1</span><span class="p">,</span> <span class="nx">value2</span><span class="p">,</span> <span class="nx">operation</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Calculator Program:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter value1:56</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter value2:54</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Select Operation to Perform</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 1) ADD</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 2) SUBTRACT</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 3) MULTIPLY</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 4) DIVIDE</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter the operation number:3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Result of Operation is: 3024</span>
</span></span></code></pre></div><h1 id="additional-datatypes">Additional Datatypes</h1>
<h2 id="arrays">Arrays</h2>
<p>We create <strong>arrays</strong> to store a sequence of values with the same datatype. Go arrays have explicitly defined sizes associated with their datatype.</p>
<p>Individual elements in an array could be accessed by their index (starting from <code>0</code>). For example, to access the 3rd element in the <code>array</code> we can simply call <code>array[2]</code>.</p>
<p>An array is defined as <code>array := [5]int{2, 4, 8, 16, 32}</code>. <code>len()</code> function returns the length of the array.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">arrayExample</span> <span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Zero Value Array:&#34;</span><span class="p">,</span> <span class="nx">arrayExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">arrayExample</span><span class="p">[</span><span class="mi">1</span><span class="p">]=</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Changed arrayExample:&#34;</span><span class="p">,</span> <span class="nx">arrayExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">arrayExample2</span> <span class="o">:=</span> <span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">21</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Another arrayExample:&#34;</span><span class="p">,</span> <span class="nx">arrayExample2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Zero Value Array: [0 0 0 0 0]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Changed arrayExample: [0 2 0 0 0]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Another arrayExample: [2 3 1 3 21]</span>
</span></span></code></pre></div><h2 id="slices">Slices</h2>
<p>A segment of an array could be extracted by creating its <strong>slice</strong>. To extract a segment starting from index <code>2</code> till index <code>5</code> in an array called <code>arrayExample</code> we can simply write <code>arrayExample[2:5]</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">arrayExample2</span> <span class="o">:=</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">234</span><span class="p">,</span> <span class="mi">23</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">lowIndex</span> <span class="o">:=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="nx">highIndex</span> <span class="o">:=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Slice of arrayExample starting from index&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">lowIndex</span><span class="p">,</span> <span class="s">&#34;to&#34;</span><span class="p">,</span> <span class="nx">highIndex</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">arrayExample2</span><span class="p">[</span><span class="nx">lowIndex</span><span class="p">:</span><span class="nx">highIndex</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Slice of arrayExample starting from index&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">lowIndex</span><span class="p">,</span> <span class="s">&#34;till (including)&#34;</span><span class="p">,</span> <span class="nx">highIndex</span><span class="p">,</span> <span class="s">&#34;is:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">arrayExample2</span><span class="p">[</span><span class="nx">lowIndex</span><span class="p">:</span><span class="nx">highIndex</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Slice Length:&#34;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">arrayExample2</span><span class="p">[</span><span class="nx">lowIndex</span><span class="p">:</span><span class="nx">highIndex</span><span class="o">+</span><span class="mi">1</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Capacity of the original array:&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nb">cap</span><span class="p">(</span><span class="nx">arrayExample2</span><span class="p">[</span><span class="nx">lowIndex</span><span class="p">:</span><span class="nx">highIndex</span><span class="o">+</span><span class="mi">1</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Slice of arrayExample starting from index 2 to 5 is: [1 3 21]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Slice of arrayExample starting from index 2 till (including) 5 is: [1 3 21 234]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Slice Length: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Capacity of the original array: 5</span>
</span></span></code></pre></div><p>Any changes performed on the slice will also affect the original array.</p>
<p>The <code>cap()</code> function is used to return the capacity of the original array.</p>
<p>The length of the slice is not part of its datatype, so slices are also used as dynamically-sized arrays. A slice is created just like an array but without any size in its declaration like <code>var sliceExample []int</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">capitals</span> <span class="p">[]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="nx">capitals</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">capitals</span><span class="p">,</span> <span class="s">&#34;delhi&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">capitals</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">capitals</span><span class="p">,</span> <span class="s">&#34;london&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Slice of Capitals:&#34;</span><span class="p">,</span> <span class="nx">capitals</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Length of Capitals Slice:&#34;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">capitals</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Capacity of Capitals Slice:&#34;</span><span class="p">,</span> <span class="nb">cap</span><span class="p">(</span><span class="nx">capitals</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Slice of Capitals: [delhi london]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Length of Capitals Slice: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Capacity of Capitals Slice: 2</span>
</span></span></code></pre></div><h2 id="maps">Maps</h2>
<p>To store key-value pairs in Go we have <strong>Maps</strong>. We can define a map that stores <code>string</code> keys mapped to <code>bool</code> values with the help of <code>make()</code> function like <code>mapExample := make(map[string]bool)</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mapExample</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">bool</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mapExample</span><span class="p">[</span><span class="s">&#34;yes&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mapExample</span><span class="p">[</span><span class="s">&#34;no&#34;</span><span class="p">]</span> <span class="p">=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of Map:&#34;</span><span class="p">,</span> <span class="nx">mapExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of Map: map[no:false yes:true]</span>
</span></span></code></pre></div><h2 id="structs">Structs</h2>
<p>Go is a procedural language but to create data structures with multiple fields we have <code>struct</code>. By creating a <code>struct</code> we are adding a new datatype to our program, that&rsquo;s why the <code>type</code> keyword is used in its declaration.</p>
<p>While creating an instance of the <code>struct</code> we can pass the value to its fields like maps where the key is the name of the field.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">dog</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="nx">age</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">dog1</span> <span class="o">:=</span> <span class="nx">dog</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&#34;DoggyMcDogFace&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Dog1:&#34;</span><span class="p">,</span> <span class="nx">dog1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">dog2</span> <span class="o">:=</span> <span class="nx">dog</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&#34;AnotherDog&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="mi">3</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Dog2:&#34;</span><span class="p">,</span> <span class="nx">dog2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Dog1: {DoggyMcDogFace 1}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Dog2: {AnotherDog 3}</span>
</span></span></code></pre></div><h1 id="methods">Methods</h1>
<p><strong>Methods</strong> refer to the functions created to be executed on a specific datatype (like a <code>struct</code>). Their declaration is similar to functions with the addition of <code>struct</code> argument after <code>func</code> keyword like <code>func (d dog) showFields() () { }</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">dog</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="nx">age</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">d</span> <span class="nx">dog</span><span class="p">)</span> <span class="nf">showFields</span><span class="p">()</span> <span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Name of Dog:&#34;</span><span class="p">,</span> <span class="nx">d</span><span class="p">.</span><span class="nx">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Age of Dog:&#34;</span><span class="p">,</span> <span class="nx">d</span><span class="p">.</span><span class="nx">age</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">dog1</span> <span class="o">:=</span> <span class="nx">dog</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&#34;DoggyMcDogFace&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">dog1</span><span class="p">.</span><span class="nf">showFields</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nx">dog2</span> <span class="o">:=</span> <span class="nx">dog</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&#34;AnotherDog&#34;</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="mi">3</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">dog2</span><span class="p">.</span><span class="nf">showFields</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Name of Dog: DoggyMcDogFace</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Age of Dog: 1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Name of Dog: AnotherDog</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Age of Dog: 3</span>
</span></span></code></pre></div><h2 id="interfaces">Interfaces</h2>
<p><strong>Interfaces</strong> are used to group common methods.</p>
<p>Interfaces enable polymorphism in Go, which means a method&rsquo;s behavior is determined by the datatype it is applied upon.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">ubuntu</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">releaseName</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="nx">releaseVersion</span> <span class="kt">float64</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">u</span> <span class="nx">ubuntu</span><span class="p">)</span> <span class="nf">showUpdateCommand</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Update command for&#34;</span><span class="p">,</span> <span class="nx">u</span><span class="p">.</span><span class="nx">releaseName</span><span class="p">,</span> <span class="s">&#34;is&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;\tapt-get update &amp;&amp; apt-get upgrade&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">fedora</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">releaseName</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">    <span class="nx">releaseVersion</span> <span class="kt">float64</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">f</span> <span class="nx">fedora</span><span class="p">)</span> <span class="nf">showUpdateCommand</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Update command for&#34;</span><span class="p">,</span> <span class="nx">f</span><span class="p">.</span><span class="nx">releaseName</span><span class="p">,</span> <span class="s">&#34;is&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;\tdnf update&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">distro</span> <span class="kd">interface</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">showUpdateCommand</span><span class="p">()</span>    
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">exampleDistro</span><span class="p">,</span> <span class="nx">exampleDistro2</span> <span class="nx">distro</span>
</span></span><span class="line"><span class="cl">    <span class="nx">exampleDistro</span> <span class="p">=</span> <span class="nx">ubuntu</span><span class="p">{</span><span class="nx">releaseName</span><span class="p">:</span> <span class="s">&#34;Lunar Lobster&#34;</span><span class="p">,</span> <span class="nx">releaseVersion</span><span class="p">:</span> <span class="mf">23.04</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of a distro:&#34;</span><span class="p">,</span> <span class="nx">exampleDistro</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">exampleDistro</span><span class="p">.</span><span class="nf">showUpdateCommand</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">exampleDistro2</span> <span class="p">=</span> <span class="nx">fedora</span><span class="p">{</span><span class="nx">releaseName</span><span class="p">:</span> <span class="s">&#34;Fedora 39&#34;</span><span class="p">,</span> <span class="nx">releaseVersion</span><span class="p">:</span> <span class="mf">39.00</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of another distro:&#34;</span><span class="p">,</span> <span class="nx">exampleDistro2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">exampleDistro2</span><span class="p">.</span><span class="nf">showUpdateCommand</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of a distro: {Lunar Lobster 23.04}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Update command for Lunar Lobster is</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 	 apt-get update &amp;&amp; apt-get upgrade</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of another distro: {Fedora 39 39}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Update command for Fedora 39 is</span>
</span></span><span class="line"><span class="cl"><span class="c1">//	  dnf update</span>
</span></span></code></pre></div><h1 id="for-loops">For Loops</h1>
<p>Loops allow us to execute a statement multiple times until some condition is valid.</p>
<p>A <code>for</code> loop requires three statements:</p>
<ul>
<li>initializing statement: This statement will be executed once before the loop has started.</li>
<li>conditional expression: This expression will be evaluated after each execution of the loop. The loop will stop if this expression evaluates to <code>false</code>.</li>
<li>incrementing statement: This statement is executed after each iteration of the loop</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Initializing Statement: i:=0 (i is initialized with value 0)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Conditional Expression: i&lt;10 (until i is less than 10)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Incrementing Statement: i++  (increment i by 1)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="p">&lt;</span><span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value of i:&#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 0</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 5</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 6</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 7</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 8</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of i: 9</span>
</span></span></code></pre></div><h2 id="for-loop-over-an-array">For Loop over an Array</h2>
<p><code>len(array)</code> will return the length of an array, by using its length we can calculate the last index of an array i.e. <code>len(array)-1</code>. This will help us write a loop that accesses each element of an array using its index.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">arrayExample</span> <span class="o">:=</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">123</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">45</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">i</span><span class="o">:=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="p">&lt;</span><span class="nb">len</span><span class="p">(</span><span class="nx">arrayExample</span><span class="p">);</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Element at index &#34;</span><span class="p">,</span> <span class="nx">i</span><span class="p">,</span> <span class="s">&#34;in arrayExample is&#34;</span><span class="p">,</span> <span class="nx">arrayExample</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index  0 in arrayExample is 123</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index  1 in arrayExample is 21</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index  2 in arrayExample is 3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index  3 in arrayExample is 54</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index  4 in arrayExample is 65</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Element at index  5 in arrayExample is 45</span>
</span></span></code></pre></div><h2 id="range">Range</h2>
<p>To iterate over data structures such as slices, maps, and strings we can take the help of <code>range</code>. Each iteration of a loop implemented with <code>range</code> will return two values depending on the data structure passed to it:</p>
<ul>
<li>for string, it will return the byte position of the character and character</li>
<li>for array/slices, it will return the index and the element</li>
<li>for maps, it will return the key and value</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">sliceExample</span> <span class="p">[]</span><span class="kt">float64</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sliceExample</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">sliceExample</span><span class="p">,</span> <span class="mf">4.3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sliceExample</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">sliceExample</span><span class="p">,</span> <span class="mf">5.2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sliceExample</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">sliceExample</span><span class="p">,</span> <span class="mf">64.3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">sliceExample</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">sliceExample</span><span class="p">,</span> <span class="mf">34.8</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of a Slice:&#34;</span><span class="p">,</span> <span class="nx">sliceExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">sliceExample</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value at index&#34;</span><span class="p">,</span> <span class="nx">index</span><span class="p">,</span> <span class="s">&#34;in sliceExample is&#34;</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">stringExample</span> <span class="o">:=</span> <span class="s">&#34;Hello, World&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of a String:&#34;</span><span class="p">,</span> <span class="nx">stringExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">pos</span><span class="p">,</span> <span class="nx">char</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">stringExample</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%#U character is at position %d\n&#34;</span><span class="p">,</span> <span class="nx">char</span><span class="p">,</span> <span class="nx">pos</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">mapExample</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mapExample</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">=</span> <span class="s">&#34;one&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mapExample</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">=</span> <span class="s">&#34;two&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mapExample</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">=</span> <span class="s">&#34;four&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of a Map:&#34;</span><span class="p">,</span> <span class="nx">mapExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">value</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">mapExample</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value for key&#34;</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="s">&#34;in mapExample is&#34;</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of a Slice: [4.3 5.2 64.3 34.8]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value at index 0 in sliceExample is 4.3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value at index 1 in sliceExample is 5.2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value at index 2 in sliceExample is 64.3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value at index 3 in sliceExample is 34.8</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of a String: Hello, World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+0048 &#39;H&#39; character is at position 0</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+0065 &#39;e&#39; character is at position 1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+006C &#39;l&#39; character is at position 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+006C &#39;l&#39; character is at position 3</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+006F &#39;o&#39; character is at position 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+002C &#39;,&#39; character is at position 5</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+0020 &#39; &#39; character is at position 6</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+0057 &#39;W&#39; character is at position 7</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+006F &#39;o&#39; character is at position 8</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+0072 &#39;r&#39; character is at position 9</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+006C &#39;l&#39; character is at position 10</span>
</span></span><span class="line"><span class="cl"><span class="c1">// U+0064 &#39;d&#39; character is at position 11</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of a Map: map[1:one 2:two 4:four]</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value for key 1 in mapExample is one</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value for key 2 in mapExample is two</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value for key 4 in mapExample is four</span>
</span></span></code></pre></div><h2 id="substitute-for-while-loop">Substitute for <code>while</code> Loop</h2>
<p>Go doesn&rsquo;t have <code>while</code> loops but we can use <code>for</code> loops for the same purpose by executing it with just the conditional expression.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Enter an odd number to end the loop&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">flag</span> <span class="o">:=</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="nx">flag</span><span class="o">==</span><span class="kc">false</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="kd">var</span> <span class="nx">input</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Enter a value:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">input</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="nx">input</span><span class="o">%</span><span class="mi">2</span><span class="o">!=</span><span class="mi">0</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">flag</span><span class="p">=</span><span class="kc">true</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Loop ended&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter an odd number to end the loop</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter a value:2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter a value:42</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter a value:52</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter a value:68</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter a value:69</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Loop ended</span>
</span></span></code></pre></div><h1 id="pointers">Pointers</h1>
<p>Pointers for a datatype will store the address of a value rather than the value itself. So an integer pointer (<code>*int</code>) will store the address of an integer value.</p>
<p>To fetch the address of a value we use <code>&amp;</code> operand. For example, to fetch the address of the value stored in the <code>intExample</code> variable we call <code>&amp;intExample</code>. Similarly to fetch the value stored at an address we use <code>*</code> operand like <code>*(&amp;intExample)</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">intExample</span> <span class="o">:=</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value of intExample:&#34;</span><span class="p">,</span> <span class="nx">intExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Memory address of intExample:&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">intExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">pointerExample</span> <span class="o">*</span><span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">pointerExample</span> <span class="p">=</span> <span class="o">&amp;</span><span class="nx">intExample</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value of pointerExample:&#34;</span><span class="p">,</span> <span class="nx">pointerExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Value stored at pointerExample address:&#34;</span><span class="p">,</span> <span class="o">*</span><span class="nx">pointerExample</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of intExample: 2</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Memory address of intExample: 0xc000022050</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value of pointerExample: 0xc000022050</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Value stored at pointerExample address: 2</span>
</span></span></code></pre></div><p>When methods are defined on the pointer of the <code>struct</code> rather than the <code>struct</code> themselves then they can manipulate the value of fields in the original instance rather than its copy.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">car</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">color</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">car</span><span class="p">)</span> <span class="nf">changeColor</span><span class="p">(</span><span class="nx">color</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">c</span><span class="p">.</span><span class="nx">color</span> <span class="p">=</span> <span class="nx">color</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><span class="nx">car</span><span class="p">)</span> <span class="nf">changeColorPointer</span><span class="p">(</span><span class="nx">color</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">c</span><span class="p">.</span><span class="nx">color</span> <span class="p">=</span> <span class="nx">color</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newCar</span> <span class="o">:=</span> <span class="nx">car</span><span class="p">{</span><span class="nx">color</span><span class="p">:</span> <span class="s">&#34;red&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;newCar: &#34;</span><span class="p">,</span> <span class="nx">newCar</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// This will not work as the change is not performed </span>
</span></span><span class="line"><span class="cl">    <span class="c1">// on the original memory address but on its copy</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newCar</span><span class="p">.</span><span class="nf">changeColor</span><span class="p">(</span><span class="s">&#34;blue&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;newCar after changing color: &#34;</span><span class="p">,</span> <span class="nx">newCar</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">newCarPtr</span> <span class="o">*</span><span class="nx">car</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newCarPtr</span> <span class="p">=</span> <span class="o">&amp;</span><span class="nx">newCar</span>
</span></span><span class="line"><span class="cl">    <span class="nx">newCarPtr</span><span class="p">.</span><span class="nf">changeColorPointer</span><span class="p">(</span><span class="s">&#34;blue&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;newCar after changing color using pointer: &#34;</span><span class="p">,</span> <span class="nx">newCar</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// newCar:  {red}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// newCar after changing color:  {red}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// newCar after changing color using pointer:  {blue}</span>
</span></span></code></pre></div><h1 id="errors">Errors</h1>
<p>In Go, errors are like other return types. So a function can return two values one being the output of the function and the other value could be an <code>error</code> interface. We can declare this in the function&rsquo;s signature like <code>func sampleFunc(value int) (int, error) { }</code>.</p>
<p>A custom error is created using <code>errors.New()</code> function is available in the <code>errors</code> package.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;errors&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">divide</span><span class="p">(</span><span class="nx">value1</span><span class="p">,</span> <span class="nx">value2</span> <span class="kt">int</span><span class="p">)</span> <span class="p">(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">value2</span><span class="o">==</span><span class="mi">0</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;Divide by Zero Error. Change value2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> 
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">value1</span><span class="o">/</span><span class="nx">value2</span><span class="p">,</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">value1</span><span class="p">,</span> <span class="nx">value2</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Enter value1:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">value1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Enter value2:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">value2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nx">quotient</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nf">divide</span><span class="p">(</span><span class="nx">value1</span><span class="p">,</span> <span class="nx">value2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Quotient:&#34;</span><span class="p">,</span> <span class="nx">quotient</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">err</span><span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Error:&#34;</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter value1:1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Enter value2:0</span>
</span></span><span class="line"><span class="cl"><span class="c1">// ERROR!</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Quotient: -1</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Error: Divide by Zero Error. Change value2</span>
</span></span></code></pre></div><p>To catch an unexpected error and exit the program we call the <code>panic()</code> function with a string or the error as its argument. If we don&rsquo;t want the program to abort on <code>panic()</code> we can follow it up with a <code>recover()</code> function.</p>
<h1 id="resources">Resources</h1>
<p><a href="https://gobyexample.com/" target="_blank">Go by Example</a><br>
<a href="https://www.youtube.com/watch?v=C8LgvuEBraI" target="_blank">Learn Go in 12 Minutes</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
