<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://coderparth.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://coderparth.github.io/" rel="alternate" type="text/html" /><updated>2026-06-28T04:33:11+00:00</updated><id>https://coderparth.github.io/feed.xml</id><title type="html">Parth Sigdel</title><entry><title type="html">An Intro to C#</title><link href="https://coderparth.github.io/2026/06/28/an-intro-to-csharp.html" rel="alternate" type="text/html" title="An Intro to C#" /><published>2026-06-28T00:00:00+00:00</published><updated>2026-06-28T00:00:00+00:00</updated><id>https://coderparth.github.io/2026/06/28/an-intro-to-csharp</id><content type="html" xml:base="https://coderparth.github.io/2026/06/28/an-intro-to-csharp.html"><![CDATA[<p><code class="language-plaintext highlighter-rouge">NOTE: Everything is written in simple and short words — like a student's notes.</code></p>

<h2 id="declaring-variables-of-different-types">Declaring variables of different types:</h2>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// type variablename = value; </span>
<span class="kt">int</span> <span class="n">num</span><span class="p">;</span>
<span class="kt">string</span> <span class="n">s</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">b</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">ch</span><span class="p">;</span>
<span class="kt">double</span> <span class="n">dub</span><span class="p">;</span>
<span class="kt">float</span> <span class="n">fl</span><span class="p">;</span>
<span class="kt">decimal</span> <span class="n">dc</span><span class="p">;</span>
<span class="c1">// arrays are of fixed length and can be provided a size during initialisation. </span>
<span class="c1">// Compiler infers the size if you do not provide it. </span>
<span class="kt">int</span><span class="p">[]</span> <span class="n">arr</span><span class="p">;</span> 
<span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">nums</span><span class="p">;</span> <span class="c1">// List&lt;type&gt; varname</span>
<span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span> <span class="n">dict</span><span class="p">;</span>  <span class="c1">// Dictionary&lt;keyType, valueType&gt; varname;</span>
</code></pre></div></div>

<h2 id="initialising-variables-of-different-types">Initialising variables of different types.</h2>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Syntax: </span>
<span class="c1">// Either `var varname = value;` — here type is inferred by the compiler </span>
<span class="c1">// Or `type varname = value;`</span>

<span class="kt">var</span> <span class="n">num1</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">num2</span> <span class="p">=</span> <span class="m">2</span><span class="p">;</span>

<span class="kt">var</span> <span class="n">dub1</span> <span class="p">=</span> <span class="m">1.99</span><span class="p">;</span>
<span class="kt">double</span> <span class="n">dub2</span> <span class="p">=</span> <span class="m">2.99</span><span class="p">;</span>

<span class="kt">var</span> <span class="n">fl1</span> <span class="p">=</span> <span class="m">1.99f</span><span class="p">;</span> <span class="c1">// for float 'f' or 'F' suffix must be provided at the end of the value.</span>
<span class="kt">float</span> <span class="n">fl2</span> <span class="p">=</span> <span class="m">2.99f</span><span class="p">;</span>

<span class="kt">var</span> <span class="n">dc1</span> <span class="p">=</span> <span class="m">1.99</span><span class="n">m</span><span class="p">;</span>
<span class="kt">decimal</span> <span class="n">dc2</span> <span class="p">=</span> <span class="m">2.99</span><span class="n">m</span><span class="p">;</span> <span class="c1">// for decimal 'm' or 'M' suffix must be provided at the end of the value.</span>

<span class="kt">var</span> <span class="n">ch1</span> <span class="p">=</span> <span class="sc">'A'</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">ch2</span> <span class="p">=</span> <span class="sc">'B'</span><span class="p">;</span>

<span class="kt">var</span> <span class="n">s1</span> <span class="p">=</span> <span class="s">"first one"</span><span class="p">;</span>
<span class="kt">string</span> <span class="n">s2</span> <span class="p">=</span> <span class="s">"second one"</span><span class="p">;</span>

<span class="kt">var</span> <span class="n">b1</span> <span class="p">=</span> <span class="k">true</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">b2</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>

<span class="c1">// Ways to Initialise an array:</span>

<span class="c1">// NOTE: Some of the other ways to initialise an array, a list, and a dictionary have not been added here.</span>
<span class="c1">// Only standard and recommended ways have been added.</span>

<span class="c1">// recommended way for legacy projects</span>
<span class="kt">int</span><span class="p">[]</span> <span class="n">arr1</span> <span class="p">=</span> <span class="p">{</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span> <span class="p">};</span> <span class="c1">// creates an array with values {1, 2, 3}</span>

<span class="c1">// recommended for new projects</span>
<span class="kt">int</span><span class="p">[]</span> <span class="n">arr2</span> <span class="p">=</span> <span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">];</span> <span class="c1">// use square brackets; creates an array with values [1, 2, 3].</span>

<span class="c1">// Ways to initialise a list:</span>

<span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">nums1</span> <span class="p">=</span> <span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">];</span> <span class="c1">// modern syntax: c# 12+</span>
<span class="c1">// traditional standard: using var keyword</span>
<span class="kt">var</span> <span class="n">nums2</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;()</span> <span class="p">{</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span> <span class="p">};</span> 


<span class="c1">// Ways to initialise a dictionary:</span>
<span class="c1">// classic way:</span>
<span class="kt">var</span> <span class="n">dict1</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span> <span class="p">{</span>
    <span class="p">{</span><span class="s">"user1"</span><span class="p">,</span> <span class="m">1</span><span class="p">},</span>
<span class="p">};</span>

<span class="c1">// Recommended way:</span>
<span class="kt">var</span> <span class="n">dict2</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span>
<span class="p">{</span>
    <span class="p">[</span><span class="s">"user1"</span><span class="p">]</span> <span class="p">=</span> <span class="m">1</span><span class="p">,</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="constants">Constants</h2>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// const type varname = value;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">num</span> <span class="p">=</span> <span class="m">5</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="oop">OOP</h2>
<p>In short words, Object-oriented programming (OOP) is a way of designing software around data, or objects, rather than functions and logic.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">Finance</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">Notes</span><span class="p">;</span> <span class="c1">// namespace is like a declaration of name for this package.</span>


<span class="k">class</span> <span class="nc">Cheatsheet</span>
<span class="p">{</span>
    <span class="c1">// Main method; methods behave similar to functions from other languages. </span>
    <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span> <span class="c1">// static keyword: this method belongs to the class itself, and not an instance.  </span>
    <span class="p">{</span>

        <span class="kt">var</span> <span class="n">c</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Car</span><span class="p">(</span><span class="s">"toyota"</span><span class="p">,</span> <span class="m">2022</span><span class="p">,</span> <span class="s">"Dean"</span><span class="p">,</span> <span class="m">5000</span><span class="p">);</span>
        <span class="kt">var</span> <span class="n">c2</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Car</span><span class="p">(</span><span class="s">"nissan"</span><span class="p">,</span> <span class="m">2020</span><span class="p">,</span> <span class="s">"Noah"</span><span class="p">,</span> <span class="m">4000</span><span class="p">);</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">c</span><span class="p">.</span><span class="n">Brand</span><span class="p">);</span> <span class="c1">// toyota</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">c</span><span class="p">.</span><span class="n">EofySale</span><span class="p">);</span> <span class="c1">// false</span>
                                       <span class="c1">// Console.WriteLine(c.EofySale); // you can do this way too, if you have created a property. </span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">c</span><span class="p">.</span><span class="nf">PriceAfterDiscount</span><span class="p">());</span> <span class="c1">// 4500</span>

        <span class="c1">// call static method for Car.</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">Car</span><span class="p">.</span><span class="nf">CarInstances</span><span class="p">());</span> <span class="c1">// 2</span>

        <span class="c1">// call another namespace </span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">FinanceOptions</span><span class="p">.</span><span class="nf">IsAvailable</span><span class="p">(</span><span class="n">c2</span><span class="p">.</span><span class="n">CustomerName</span><span class="p">));</span> <span class="c1">// true </span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">FinanceOptions</span><span class="p">.</span><span class="n">s_customers</span><span class="p">[</span><span class="m">0</span><span class="p">]);</span> <span class="c1">// here, internal is accessible because they are in same assembly (project), </span>
                                                          <span class="c1">// even though they have different namespace.</span>

        <span class="c1">// c.EofySale = true; // This will throw an error as only get method have been added for this member.</span>
        <span class="c1">// Console.WriteLine(c.CarInstances()); // this will fail: static methods can only be invoked on the Class itself.</span>

        <span class="c1">// call static method for Car</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">Car</span><span class="p">.</span><span class="nf">CarInstances</span><span class="p">());</span> <span class="c1">// 3</span>

    <span class="p">}</span>
<span class="p">}</span>


<span class="c1">// class and objects.</span>
<span class="k">class</span> <span class="nc">Car</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">bool</span> <span class="n">EofySale</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// syntatic sugar to allow get method only.</span>

    <span class="k">public</span> <span class="kt">string</span> <span class="n">Brand</span><span class="p">;</span> <span class="c1">// public keyword (also called an access modifier) makes a field accessible from outside.</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Year</span><span class="p">;</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Cost</span><span class="p">;</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">CustomerName</span><span class="p">;</span>
    <span class="k">private</span> <span class="kt">decimal</span> <span class="n">_discountPercent</span> <span class="p">=</span> <span class="m">10.00</span><span class="n">m</span><span class="p">;</span> <span class="c1">// private: can only be accessed within the same class, not accessible from an instance. </span>

    <span class="k">static</span> <span class="kt">int</span> <span class="n">s_noOfInstances</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="c1">// fields are private by default, cannot be accessed outside of the class. </span>

    <span class="c1">// Constructor</span>
    <span class="k">public</span> <span class="nf">Car</span><span class="p">(</span><span class="kt">string</span> <span class="n">brand</span><span class="p">,</span> <span class="kt">int</span> <span class="n">year</span><span class="p">,</span> <span class="kt">string</span> <span class="n">customerName</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cost</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">this</span><span class="p">.</span><span class="n">Brand</span> <span class="p">=</span> <span class="n">brand</span><span class="p">;</span> <span class="c1">// this keyword refers to the values for this specific instance/object.</span>
        <span class="k">this</span><span class="p">.</span><span class="n">Year</span> <span class="p">=</span> <span class="n">year</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="n">CustomerName</span> <span class="p">=</span> <span class="n">customerName</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="n">EofySale</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="n">Cost</span> <span class="p">=</span> <span class="n">cost</span><span class="p">;</span>
        <span class="n">s_noOfInstances</span><span class="p">++;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="kt">int</span> <span class="nf">CarInstances</span><span class="p">()</span> <span class="c1">// static keyword: this method belongs to the class itself, and not an instance.  </span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">s_noOfInstances</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="kt">decimal</span> <span class="nf">PriceAfterDiscount</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="n">Cost</span> <span class="p">-</span> <span class="p">((</span><span class="k">this</span><span class="p">.</span><span class="n">_discountPercent</span> <span class="p">/</span> <span class="m">100</span><span class="p">)</span> <span class="p">*</span> <span class="k">this</span><span class="p">.</span><span class="n">Cost</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Finance.cs</span>
<span class="k">namespace</span> <span class="nn">Finance</span><span class="p">;</span>


<span class="k">class</span> <span class="nc">FinanceOptions</span>
<span class="p">{</span>
    <span class="k">internal</span> <span class="k">static</span> <span class="kt">string</span><span class="p">[]</span> <span class="n">s_customers</span> <span class="p">=</span> <span class="p">{</span> <span class="s">"John"</span><span class="p">,</span> <span class="s">"Aki"</span><span class="p">,</span> <span class="s">"Noah"</span> <span class="p">};</span> <span class="c1">// internal: accessible anywhere within this assembly.</span>

    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">IsAvailable</span><span class="p">(</span><span class="kt">string</span> <span class="n">customerName</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">string</span> <span class="n">c</span> <span class="k">in</span> <span class="n">s_customers</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">c</span> <span class="p">==</span> <span class="n">customerName</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// Encapsulation: 
// In C#, usually "private" keyword and properties are used to achieve 
// encapsulation — encapsulation means hiding sensitive data from the users, 
// and protecting the integrity of an object's internal state.  



// A note on access modifiers:
// public: code is accessible for all classes
// private: code is only accessible within the same class  —  not accessible from an instance.
// protected: code is only accessible within the same class, or in a class that inherits this class. 
// internal: code is accessible within its own assembly (project). 
// 	     field with "internal" can be used throughout this project, even though they maybe of different namespaces.  
// 	     Example: If you have install a package which has internal field, you cannot access that field from your project. 
// static: code belongs to the class itself, and not an instance.  
</code></pre></div></div>

<h2 id="c-naming-conventions">C# Naming Conventions:</h2>
<ul>
  <li>Public methods, fields, and classes: PascalCase</li>
  <li>Private methods: camelCase</li>
  <li>Private fields: _camelCase</li>
  <li>local variables, parameters: camelCase</li>
  <li>Interface: IPascalCase (Note: Letter ‘I’ is required at front)</li>
  <li>static fields: s_camelCase</li>
  <li>static methods: camelCase</li>
</ul>

<h2 id="inheritance">Inheritance:</h2>
<p>Inheritance is a way to inherit fields and methods from parent class (base class) to child class (derived class). In C#, this is achieved using the single colon “:” symbol.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// UsedCar inherits the parent class "Car"</span>

<span class="k">class</span> <span class="nc">UsedCar</span> <span class="p">:</span> <span class="n">Car</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">WarrantyYears</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// read-only field for anyone accessing this field outside this class.</span>

    <span class="c1">// base passes the arguments for these parameters to the parent class's constructor. </span>
    <span class="k">public</span> <span class="nf">UsedCar</span><span class="p">(</span><span class="kt">string</span> <span class="n">brand</span><span class="p">,</span> <span class="kt">int</span> <span class="n">year</span><span class="p">,</span> <span class="kt">string</span> <span class="n">customerName</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cost</span><span class="p">)</span> <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">brand</span><span class="p">,</span> <span class="n">year</span><span class="p">,</span> <span class="n">customerName</span><span class="p">,</span> <span class="n">cost</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">cost</span> <span class="p">&gt;</span> <span class="m">5000</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">this</span><span class="p">.</span><span class="n">WarrantyYears</span> <span class="p">=</span> <span class="m">3</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span>
        <span class="p">{</span>
            <span class="k">this</span><span class="p">.</span><span class="n">WarrantyYears</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="c1">// Use sealed keyword to not allow the class to be inherited. </span>
<span class="k">sealed</span> <span class="k">class</span> <span class="nc">Person</span>
<span class="p">{</span>
<span class="p">}</span>

<span class="c1">// This will fail: no class can inherit from Person. </span>
<span class="c1">// class Student: Person {</span>
<span class="c1">// }</span>

</code></pre></div></div>

<h2 id="polymorphism">Polymorphism:</h2>
<p>Polymorphism means “many forms”. 
In programming, this mainly refers to methods of inherited classes with same name as parent’s method, but different behaviours.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Example without polymorphism: </span>

<span class="k">namespace</span> <span class="nn">Notes</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Cheatsheet</span>
<span class="p">{</span>
    <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Device</span> <span class="n">dv</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Device</span><span class="p">();</span>

        <span class="c1">// Here, variable mp's reference type is "Device". </span>
        <span class="c1">// Even though it's actual object type is "Mobile", </span>
        <span class="c1">// when the method with same name "getInfo" is called, C# uses the parent's method. </span>
        <span class="c1">// This is C#'s hiding behaviour. </span>
        <span class="c1">// Polymorphism is used in the next paragraph to solve this problem.</span>
        <span class="n">Device</span> <span class="n">mp</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Mobile</span><span class="p">();</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">dv</span><span class="p">.</span><span class="nf">GetInfo</span><span class="p">());</span> <span class="c1">// I am a device</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">mp</span><span class="p">.</span><span class="nf">GetInfo</span><span class="p">());</span> <span class="c1">// I am a device </span>

    <span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">Device</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="nf">GetInfo</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"I am a device"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">Mobile</span> <span class="p">:</span> <span class="n">Device</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="nf">GetInfo</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"I am a mobile phone"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Example with polymorphism:</span>
<span class="c1">// In C#, polymorphism is achieved using `virtual` keyword on the method inside the base class, </span>
<span class="c1">// and 'override' keyword on the method with same name in the derived class. </span>

<span class="k">namespace</span> <span class="nn">Notes</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Cheatsheet</span>
<span class="p">{</span>
    <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Device</span> <span class="n">dv</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Device</span><span class="p">();</span>
        <span class="n">Device</span> <span class="n">mp</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Mobile</span><span class="p">();</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">dv</span><span class="p">.</span><span class="nf">GetInfo</span><span class="p">());</span> <span class="c1">// I am a device</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">mp</span><span class="p">.</span><span class="nf">GetInfo</span><span class="p">());</span> <span class="c1">// I am a mobile phone</span>

    <span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">Device</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">virtual</span> <span class="kt">string</span> <span class="nf">GetInfo</span><span class="p">()</span> <span class="c1">// virtual keyword in the base class's method.</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"I am a device"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">Mobile</span> <span class="p">:</span> <span class="n">Device</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">GetInfo</span><span class="p">()</span> <span class="c1">// override keyword in the derived class's method. </span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"I am a mobile phone"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

</code></pre></div></div>
<h2 id="abstraction">Abstraction:</h2>
<p>In simple words, abstraction is about hiding complexity from the user.</p>

<p>Example: Let us say “stripe” provides a method charge that charges the amount from user when card and amount are passed as arguments. 
stripe(card, amount)</p>

<p>Here, when we call this method, we don’t know <code class="language-plaintext highlighter-rouge">(and don't have to know)</code> all internal things such as fraud checks, http calls, etc. 
This is an example of abstraction.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Difference between encapsulation and abstraction:Encapsulation is about hiding what's inside, 
while abstraction is about how things are done. 
</code></pre></div></div>

<p>In C#, abstraction can be achieved primarily by two ways:</p>
<ul>
  <li>Using “abstract” keyword is used for classes and methods.</li>
  <li>Using interface.</li>
</ul>

<p>In C#, an object/instance cannot be created from an abstract class.</p>

<p>Methods with abstract keyword can only live inside an abstract class. 
Abstract methods cannot have a body, and the derived class that inherits from the abstract class 
overrides the abstract method, and provides a body.</p>

<p>Example using “abstract” keyword:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">PaymentFlow</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Payment</span>
<span class="p">{</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">PaymentType</span> <span class="n">pp</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">PayPal</span><span class="p">();</span>
        <span class="n">PaymentType</span> <span class="n">ap</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Afterpay</span><span class="p">();</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">pp</span><span class="p">.</span><span class="nf">Checkout</span><span class="p">());</span> <span class="c1">// You are now paying via PayPal</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">ap</span><span class="p">.</span><span class="nf">Checkout</span><span class="p">());</span> <span class="c1">// You are now paying via Afterpay</span>


        <span class="c1">// NOTE: Polymorphism is occuring here.</span>
        <span class="c1">// The reference type is "PaymentType" and actual object types are "PayPal" and "Afterpay". </span>
        <span class="c1">// The method "Checkout" of the parent class gets overriden by the "Checkout" of the derived class. </span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">abstract</span> <span class="k">class</span> <span class="nc">PaymentType</span>
<span class="p">{</span>
    <span class="c1">// abstract methods cannot have a body.</span>
    <span class="k">public</span> <span class="k">abstract</span> <span class="kt">string</span> <span class="nf">Checkout</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">PayPal</span> <span class="p">:</span> <span class="n">PaymentType</span>
<span class="p">{</span>
    <span class="c1">// Abstract method gets override on the derived class. </span>
    <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">Checkout</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"You are now paying via PayPal"</span><span class="p">;</span>
    <span class="p">}</span>

<span class="p">}</span>

<span class="k">class</span> <span class="nc">Afterpay</span> <span class="p">:</span> <span class="n">PaymentType</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">Checkout</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"You are now paying via Afterpay"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="interface">Interface</h2>
<p>Interface is a completely abstract class, whose members are abstract and public by default. 
It can only contain methods and properties with empty body — not fields.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">OrderingSystem</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Order</span>
<span class="p">{</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">dl</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Delivery</span><span class="p">();</span>
        <span class="kt">var</span> <span class="n">cc</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">ClickAndCollect</span><span class="p">();</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">dl</span><span class="p">.</span><span class="nf">Order</span><span class="p">());</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">cc</span><span class="p">.</span><span class="nf">Order</span><span class="p">());</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">cc</span><span class="p">.</span><span class="nf">Address</span><span class="p">());</span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="k">interface</span> <span class="nc">IOrderType</span> <span class="c1">// Good practice to add 'I' at the beginning of an interface's name.</span>
<span class="p">{</span>
    <span class="kt">string</span> <span class="nf">Order</span><span class="p">();</span> <span class="c1">// methods/properties are abstract and public by default. </span>
<span class="p">}</span>

<span class="k">interface</span> <span class="nc">IAddress</span>
<span class="p">{</span>
    <span class="kt">string</span> <span class="nf">Address</span><span class="p">();</span>
<span class="p">}</span>


<span class="c1">// Use the : colon to implement an interface (just like inheriting)</span>
<span class="k">class</span> <span class="nc">Delivery</span> <span class="p">:</span> <span class="n">IOrderType</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="nf">Order</span><span class="p">()</span> <span class="c1">// No need to add "override" keyword on methods of the class that implements an interface. </span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"Your order will be delivered within 3 business days."</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="k">class</span> <span class="nc">ClickAndCollect</span> <span class="p">:</span> <span class="n">IOrderType</span><span class="p">,</span> <span class="n">IAddress</span> <span class="c1">// Multiple interfaces can be implemented by using ','</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="nf">Order</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"Please allow up to 4 hours for your Click &amp; Collect order to be processed."</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="kt">string</span> <span class="nf">Address</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">"Your order will be ready to collect from CS Warehouse Anewol"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="enums">enums</h2>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">enum</span> <span class="n">Phone</span>
<span class="p">{</span>
    <span class="n">Used</span><span class="p">,</span>
    <span class="n">New</span><span class="p">,</span>
    <span class="n">Refurbished</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="yield">yield</h2>
<p>C# has “yield” keyword which can be used to temporarily pause a function, and return a value to the caller.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">YielderRunner</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Yielder</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">int</span> <span class="n">num</span> <span class="k">in</span> <span class="nf">GenSingDigits</span><span class="p">())</span>
        <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">num</span> <span class="p">==</span> <span class="m">100</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">num</span><span class="p">);</span>
        <span class="p">}</span>

    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="nf">GenSingDigits</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">yield</span> <span class="k">return</span> <span class="m">0</span><span class="p">;</span>
        <span class="k">yield</span> <span class="k">return</span> <span class="m">1</span><span class="p">;</span>
        <span class="k">yield</span> <span class="k">return</span> <span class="m">2</span><span class="p">;</span>
        <span class="k">yield</span> <span class="k">return</span> <span class="m">100</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="task-async-await-record">Task, async, await, record</h2>

<ul>
  <li>In C#,<code class="language-plaintext highlighter-rouge">Task</code> represents an asynchronous operation, similar to promise concept in js.</li>
  <li><code class="language-plaintext highlighter-rouge">record</code>: a shorthand to get a type that holds data, nothing else. Pairs really well with 
JSON deserialisation, returning a record instead of returning multiple values,etc.</li>
</ul>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">ExampleAsync</span><span class="p">;</span>

<span class="k">using</span> <span class="nn">System.Net.Http.Json</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">AsyncAwaitExample</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">async</span> <span class="n">Task</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">ip</span> <span class="p">=</span> <span class="k">await</span> <span class="nf">MyIp</span><span class="p">();</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">ip</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="n">HttpClient</span> <span class="n">client</span> <span class="p">=</span> <span class="k">new</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">BaseAddress</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Uri</span><span class="p">(</span><span class="s">"https://api.ipify.org/?format=json"</span><span class="p">),</span>
    <span class="p">};</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="nf">MyIp</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">try</span>
        <span class="p">{</span>
            <span class="kt">var</span> <span class="n">ip</span> <span class="p">=</span> <span class="k">await</span> <span class="n">client</span><span class="p">.</span><span class="n">GetFromJsonAsync</span><span class="p">&lt;</span><span class="n">IP</span><span class="p">&gt;(</span><span class="s">""</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">ip</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="k">return</span> <span class="n">ip</span><span class="p">.</span><span class="n">ip</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">return</span> <span class="s">"No IP returned"</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">catch</span> <span class="p">(</span><span class="n">HttpRequestException</span> <span class="n">error</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">error</span><span class="p">.</span><span class="n">Message</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

<span class="p">}</span>

<span class="k">public</span> <span class="n">record</span> <span class="nf">IP</span><span class="p">(</span><span class="kt">string</span> <span class="n">ip</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="delegatesactionfunc">Delegates/Action/Func</h2>
<ul>
  <li>A delegate is a type that safely encapsulates a method.</li>
  <li>A delegate can be a variable that holds a method.</li>
  <li>Once in a while, you might need to send a method as a parameter to another method, and that is 
one of the scenarios where you will need delegates.</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">NOTE: Create/Use a delegate when you want the caller to inject the behaviour from outside. </code></p>

<p>An example where a delegate is a variable that holds a method.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">delegate</span> <span class="k">void</span> <span class="nf">Log</span><span class="p">(</span><span class="kt">string</span> <span class="n">s</span><span class="p">);</span> <span class="c1">// use "delegate" keyword.</span>

<span class="k">class</span> <span class="nc">Logger</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Log</span> <span class="n">logHere</span> <span class="p">=</span> <span class="n">Println</span><span class="p">;</span> <span class="c1">// Here the delegate "logHere" is holding a method "println".</span>
        <span class="nf">logHere</span><span class="p">(</span><span class="s">"Hello world"</span><span class="p">);</span> <span class="c1">// And executing the "println" here.  </span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Println</span><span class="p">(</span><span class="kt">string</span> <span class="n">msg</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">msg</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="c1">// An example where a method is sent as a parameter to another method. </span>
</code></pre></div></div>

<p>An example where a delegate holds multiple methods. 
public delegate void Remind(string s);</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Reminder</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Remind</span> <span class="n">r</span> <span class="p">=</span> <span class="n">RemindViaMessage</span><span class="p">;</span> <span class="c1">// This delegate holds RemindViaMessage.</span>
        <span class="n">r</span> <span class="p">+=</span> <span class="n">RemindViaEmail</span><span class="p">;</span> <span class="c1">// appending a method to this delegate.</span>
        <span class="n">r</span> <span class="p">+=</span> <span class="n">RemindViaNotification</span><span class="p">;</span> <span class="c1">// appending another method to this delegate.</span>

        <span class="nf">r</span><span class="p">(</span><span class="s">"Go to Csharp Meetup"</span><span class="p">);</span>
        <span class="c1">// Output:</span>
        <span class="c1">//Sending a message: Go to Csharp Meetup</span>
        <span class="c1">// Sending an email: Go to Csharp Meetup</span>
        <span class="c1">// Sending a notification: Go to Csharp Meetup</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">RemindViaMessage</span><span class="p">(</span><span class="kt">string</span> <span class="n">s</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// simulate sending a reminder via message. </span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Sending a message: </span><span class="p">{</span><span class="n">s</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">RemindViaEmail</span><span class="p">(</span><span class="kt">string</span> <span class="n">s</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// simulate sending a reminder via email. </span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Sending an email: </span><span class="p">{</span><span class="n">s</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">RemindViaNotification</span><span class="p">(</span><span class="kt">string</span> <span class="n">s</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// simulate sending a reminder via email. </span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Sending a notification: </span><span class="p">{</span><span class="n">s</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>An example where a method is sent as a parameter to another method.</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">delegate</span> <span class="k">void</span> <span class="n">PrintFunction</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="k">value</span><span class="p">);</span>

<span class="k">class</span> <span class="nc">Printer</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">nums</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="p">{</span> <span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span> <span class="p">};</span>
        <span class="nf">Print</span><span class="p">(</span><span class="n">PrintHorizontal</span><span class="p">,</span> <span class="n">nums</span><span class="p">);</span>
        <span class="nf">Print</span><span class="p">(</span><span class="n">PrintVertical</span><span class="p">,</span> <span class="n">nums</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="n">Print</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">PrintFunction</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">fn</span><span class="p">,</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="k">value</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="nf">fn</span><span class="p">(</span><span class="k">value</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="n">PrintHorizontal</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="k">value</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">v</span> <span class="k">in</span> <span class="k">value</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="s">$"</span><span class="p">{</span><span class="n">v</span><span class="p">}</span><span class="s"> "</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="n">PrintVertical</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="k">value</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">v</span> <span class="k">in</span> <span class="k">value</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<ul>
  <li>Action: Action is a built-in delegate that takes in 0-16 parameters but doesnot return a value.</li>
  <li>Func: Funce is a built-in delegate that that takes in 0-16 parametes and returns a value.</li>
</ul>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">Delegation</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Example</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Action</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">log</span> <span class="p">=</span> <span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
        <span class="nf">log</span><span class="p">(</span><span class="m">5</span><span class="p">);</span>

        <span class="c1">// Here, the last int before "&gt;" represents the return type. </span>
        <span class="n">Func</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span> <span class="k">add</span> <span class="p">=</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>
        <span class="nf">log</span><span class="p">(</span><span class="k">add</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">));</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="extension-method">Extension method:</h2>
<p>Extension method enables you to add new methods to an existing type without creating a derived type or modifying the original type. 
Three rules to follow when creating an extension method:</p>
<ol>
  <li>class using the extension method must be declared as “static” — static classes cannot instantiated or inherited.</li>
  <li>The method itself must be declared static.</li>
  <li>The data type you want to extend must have “this” keyword before writing that type.</li>
</ol>

<p>Simplest example to show an extension to an “int” type.</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Program</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">num</span> <span class="p">=</span> <span class="m">4</span><span class="p">;</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">num</span><span class="p">.</span><span class="nf">IsEven</span><span class="p">());</span> <span class="c1">// true</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// 1. class must be static.</span>
<span class="k">static</span> <span class="k">class</span> <span class="nc">ExtensionMethods</span>
<span class="p">{</span>
    <span class="c1">// 2. method must be static.</span>
    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">IsEven</span><span class="p">(</span><span class="k">this</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="c1">// 3. this keyword infront of the type is necessary.</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">n</span> <span class="p">%</span> <span class="m">2</span> <span class="p">==</span> <span class="m">0</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="cleaning-up-resources-such-as-an-opened-file-database-connection-etc">Cleaning up resources such as an opened file, database connection, etc:</h2>

<p>C# provides an interface “IDisposable” with a method “Dispose” that can be implemented on 
a class to safely cleanup the resources — if your class manages native resources.</p>

<p>When using built-in class that manages resources, you should use the <code class="language-plaintext highlighter-rouge">using</code> statement. 
This will make sure “Dispose” method gets called before this method/block returns.</p>

<p>Example of <code class="language-plaintext highlighter-rouge">using</code> statement to manage resource:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">Reader</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">File</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">try</span>
        <span class="p">{</span>
            <span class="c1">// Read a file line by line. </span>
            <span class="k">using</span> <span class="nn">var</span> <span class="n">reader</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">StreamReader</span><span class="p">(</span><span class="s">"input.txt"</span><span class="p">);</span> <span class="c1">// use "using" statement"</span>
            <span class="p">{</span>
                <span class="k">while</span> <span class="p">(</span><span class="k">true</span><span class="p">)</span>
                <span class="p">{</span>
                    <span class="kt">var</span> <span class="n">line</span> <span class="p">=</span> <span class="n">reader</span><span class="p">.</span><span class="nf">ReadLine</span><span class="p">();</span>
                    <span class="k">if</span> <span class="p">(</span><span class="n">line</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
                    <span class="p">{</span>
                        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">line</span><span class="p">);</span>
                    <span class="p">}</span>
                    <span class="k">else</span>
                    <span class="p">{</span>
                        <span class="k">break</span><span class="p">;</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">e</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">Message</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="dependency-injection">Dependency Injection</h2>
<p>Example: 
Instead of creating a new instance of a database for each controller, you inject the shared instance to all the controllers.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">DI</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">DInjection</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">db</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">DB</span><span class="p">();</span>
        <span class="n">db</span><span class="p">.</span><span class="nf">PrintUsers</span><span class="p">();</span> <span class="c1">// Luke, Noah</span>

        <span class="kt">var</span> <span class="n">uc</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">UserController</span><span class="p">(</span><span class="n">db</span><span class="p">);</span>
        <span class="n">uc</span><span class="p">.</span><span class="nf">AddUser</span><span class="p">(</span><span class="s">"Abraham"</span><span class="p">);</span>
        <span class="n">db</span><span class="p">.</span><span class="nf">PrintUsers</span><span class="p">();</span> <span class="c1">// Luke, Noah, Abraham </span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="k">class</span> <span class="nc">DB</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="n">Users</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">DB</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Users</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="p">{</span> <span class="s">"Luke"</span><span class="p">,</span> <span class="s">"Noah"</span> <span class="p">};</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">PrintUsers</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">user</span> <span class="k">in</span> <span class="n">Users</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">user</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">UserController</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="n">DB</span> <span class="n">_db</span><span class="p">;</span> <span class="c1">// underscore added in variable name to identify it as a private member. </span>

    <span class="k">public</span> <span class="nf">UserController</span><span class="p">(</span><span class="n">DB</span> <span class="n">db</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_db</span> <span class="p">=</span> <span class="n">db</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">AddUser</span><span class="p">(</span><span class="kt">string</span> <span class="n">name</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_db</span><span class="p">.</span><span class="n">Users</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[NOTE: Everything is written in simple and short words — like a student's notes.]]></summary></entry><entry><title type="html">An Intro to Docker</title><link href="https://coderparth.github.io/2026/01/22/an-intro-to-docker.html" rel="alternate" type="text/html" title="An Intro to Docker" /><published>2026-01-22T00:00:00+00:00</published><updated>2026-01-22T00:00:00+00:00</updated><id>https://coderparth.github.io/2026/01/22/an-intro-to-docker</id><content type="html" xml:base="https://coderparth.github.io/2026/01/22/an-intro-to-docker.html"><![CDATA[<h2 id="what-is-docker">What is Docker?</h2>

<p><strong>Docker</strong> is best understood with a problem that you likely have faced: the same code runs in your machine, but it does not run on your friend’s/colleague’s machine.</p>

<p>Docker solves this machine by packaging and running your application in a loosely isolated environment called a <code class="language-plaintext highlighter-rouge">container</code>. Containers contain everything that is required to run your application.</p>

<h2 id="docker-objects">Docker objects</h2>

<h3 id="images">Images:</h3>
<p>An image is a read-only template with instructions to build and run a Docker container. You might either create your own images, or use those that are available in Docker’s public registry.</p>

<p>To create your own image, a Dockerfile is used, which contains simple syntax that defines the steps needed to create that image. Each instruction creates a <code class="language-plaintext highlighter-rouge">layer</code> in the image. When a Dockerfile is changed, only the layer that has changed is rebuilt. This is what makes the rebuilding process significantly faster, compared to other virtualization technologies.</p>

<h3 id="containers">Containers:</h3>
<p>A container is a runnable instance of an image that you can create, stop, move, or delete using your CLI or Docker API. When you remove a container, all changes to its state that are not stored in a persistent disk are removed.</p>

<h2 id="example-of-docker-run-command">Example of <code class="language-plaintext highlighter-rouge">docker run</code> command</h2>

<p><code class="language-plaintext highlighter-rouge">docker run -i -t ubuntu /bin/bash</code></p>

<p>The above command runs the ubuntu container, attaches your terminal directly to the container, and runs /bin/bash.</p>

<p><strong>The following things happen under the hood:</strong></p>

<ul>
  <li>If you don’t have “ubuntu” image locally, it is pulled from the configured registry, as if you had manually run <code class="language-plaintext highlighter-rouge">docker pull ubuntu</code>.</li>
  <li>It creates a new container, as if you had manually run the <code class="language-plaintext highlighter-rouge">docker create</code> command.</li>
  <li>A read-write filesystem is allocated to the container to create or modify files and directories in its local filesystem.</li>
  <li>A network interface is created to connect the container to the default network.</li>
  <li>After the container starts, <code class="language-plaintext highlighter-rouge">/bin/bash</code> is executed.</li>
</ul>

<h2 id="docker-compose-command"><code class="language-plaintext highlighter-rouge">docker compose</code> Command</h2>

<p>Docker Compose allows you to define all your containers and configurations in a single YAML file. This is a way to replace long <code class="language-plaintext highlighter-rouge">docker run</code> commands with a clean and small <code class="language-plaintext highlighter-rouge">docker compose</code> command without having to worry about managing networks, and all the flags needed to connect those containers.</p>

<h3 id="example-of-composeyaml-file">Example of <code class="language-plaintext highlighter-rouge">compose.yaml</code> file:</h3>
<p>`
services:
  web:
    build: .
    ports:
      - “8000:5000”
  redis:
    image: “redis:alpine”
`</p>

<p>This file defines <strong>2 services</strong>: <code class="language-plaintext highlighter-rouge">web</code> and <code class="language-plaintext highlighter-rouge">redis</code>.</p>

<p>The <code class="language-plaintext highlighter-rouge">web</code> service will use the image built from the <code class="language-plaintext highlighter-rouge">Dockerfile</code> present in the current directory, and then map port <code class="language-plaintext highlighter-rouge">5000</code> of the container to the port <code class="language-plaintext highlighter-rouge">8000</code> of the host. This means that when you visit <strong>localhost:8000</strong>, Docker will send that traffic to the container’s port 5000.</p>

<p>With this, you can easily start up your application by running <code class="language-plaintext highlighter-rouge">docker compose up</code>, and without worrying about manually configuring networks in the <code class="language-plaintext highlighter-rouge">docker run</code> commands.</p>

<h2 id="to-tear-this-down">To tear this down</h2>

<p>To remove everything, simply use <code class="language-plaintext highlighter-rouge">docker compose down</code>. By default volumes are not automatically removed. To remove the volumes, add the <code class="language-plaintext highlighter-rouge">--volumes</code> flag.</p>

<p><code class="language-plaintext highlighter-rouge">docker compose down --volumes</code></p>

<h2 id="building-production-ready-images">Building production-ready images</h2>

<p>To create container images, a <code class="language-plaintext highlighter-rouge">Dockerfile</code> is used. It provides instructions to the image builder about the steps needed to build that image. These steps include: commands to run, files to copy, etc.</p>

<p>Below is an example of a Dockerfile with steps, for a simple API written in Go, listening on port 8080.</p>

<h3 id="1">1.</h3>
<p>On the first line of your Dockerfile, you can add an optional directive line that instructs the Image builder to interpret your file according to the version you have specified.<br />
<code class="language-plaintext highlighter-rouge">#syntax=docker/dockerfile:1</code></p>

<p>You can then tell the image builder about the base image that you want to use for your application using the <code class="language-plaintext highlighter-rouge">FROM</code> keyword, in this case, we are using Go.<br />
<code class="language-plaintext highlighter-rouge">FROM golang:1.25.5</code></p>

<p>So, combining that it looks like this:</p>
<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#syntax=docker/dockerfile:1</span>

<span class="k">FROM</span><span class="s"> golang:1.25.5</span>
</code></pre></div></div>

<h3 id="2">2.</h3>
<p>Next step is to make it easy to run the rest of our commands, we can create a directory inside the image that we are building. From here on, we can just type the relative paths based on this directory, and not the full file paths.</p>
<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">WORKDIR</span><span class="s"> /app</span>
</code></pre></div></div>

<p>From here on, all the commands that we write will treat this directory as our current base directory.</p>

<h3 id="3">3.</h3>
<p>The next thing you would usually do after you have downloaded your project on go, would be to install all the dependencies. In go. <code class="language-plaintext highlighter-rouge">go.sum</code> and <code class="language-plaintext highlighter-rouge">go.mod</code> handle all the required dependencies. So, the next step for us is to copy these files into our image, before we start installation. To this, we can use the <code class="language-plaintext highlighter-rouge">COPY</code> keyword, which takes two arguments, the first: the files that you want to copy, and second: the destination (the directory in which you want those files to be copied). So the next line will look like this:</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">COPY</span><span class="s"> go.mod go.sum ./</span>
</code></pre></div></div>

<p>Since we are already in our /app directory (because of the previous command), we can simply type <code class="language-plaintext highlighter-rouge">./</code> as our destination directory.</p>

<h3 id="4">4.</h3>
<p>The next step is to install all the dependencies for your project. We can install all the required dependencies in Go using <code class="language-plaintext highlighter-rouge">go mod download</code>, and we can use the <code class="language-plaintext highlighter-rouge">RUN</code> command in Docker to tell the image builder to run it. So, our next line will be:</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">RUN </span>go mod download
</code></pre></div></div>

<h3 id="5">5.</h3>
<p>Now, we can copy all our source code to our image. To do this, we can use the <code class="language-plaintext highlighter-rouge">COPY	</code> command again, just like the way we did on step 3.</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">COPY</span><span class="s"> *.go ./</span>
</code></pre></div></div>

<p>This copies all the files ending with <code class="language-plaintext highlighter-rouge">.go</code> extension to our current directory inside the image.</p>

<h3 id="6">6.</h3>
<p>The next step is to compile our go program, and we can achieve this using the <code class="language-plaintext highlighter-rouge">RUN</code> command again.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>RUN CGO_ENABLED=0 GOOS=linux go build -o /docker-go-api
</code></pre></div></div>

<p>In case, you are not familiar with the compilation command:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">CGO_ENABLED=0</code>: This tells the compiler to disable CGO (a mechanism to call C code from Go). This is done to create a truly static binary that does not depend on external C libraries.</li>
  <li><code class="language-plaintext highlighter-rouge">GOOS=linux</code>: This tells the compiler that the targeted operating system will be linux. “Linux” is specified because our container will run Linux.</li>
  <li><code class="language-plaintext highlighter-rouge">go build</code>: This is the standard command to compile, and build a binary.</li>
  <li><code class="language-plaintext highlighter-rouge">-o</code>: This specifies the output filename and path.</li>
  <li><code class="language-plaintext highlighter-rouge">/docker-go-api</code>: Our binary will be called <code class="language-plaintext highlighter-rouge">docker-go-api</code>, and will be located in the root of the filesystem of our image.</li>
</ul>

<h3 id="7">7.</h3>
<p>The next step is to add documentation about the port this app will run on. This way, the person running this container will know which port is intended to be published. We can do this using the <code class="language-plaintext highlighter-rouge">EXPOSE</code> command.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>EXPOSE 8080
</code></pre></div></div>

<p>Now the person running this container will know that this app runs on port 8080.<br />
<strong>NOTE:</strong> <code class="language-plaintext highlighter-rouge">EXPOSE</code> command does not actually publish the port, it is added only for documentation.</p>

<h3 id="8">8.</h3>
<p>The next and final command is to tell our image builder what to run when it starts a container. We can do this using the <code class="language-plaintext highlighter-rouge">CMD</code> command.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CMD [“/docker-go-api”]
</code></pre></div></div>

<p>Now, when our container starts, it will run our binary “docker-go-api”.</p>

<p>Below you can find the complete file:</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># syntax=docker/dockerfile:1</span>

<span class="k">FROM</span><span class="s"> golang:1.25.5</span>

<span class="k">WORKDIR</span><span class="s"> /app</span>

<span class="k">COPY</span><span class="s"> go.mod go.sum ./</span>

<span class="k">RUN </span>go mod download 

<span class="k">COPY</span><span class="s"> *.go ./</span>

<span class="k">RUN </span><span class="nv">CGO_ENABLED</span><span class="o">=</span>0 <span class="nv">GOOS</span><span class="o">=</span>linux go build <span class="nt">-o</span> /docker-go-api

<span class="k">EXPOSE</span><span class="s"> 8080</span>

<span class="k">CMD</span><span class="s"> ["/docker-go-api"]</span>
</code></pre></div></div>

<p>Before we go onto the next part of building this image, let’s quickly create a small Go project, with one single API, in the same directory.</p>

<h3 id="first-initialize-a-go-project">First, initialize a Go project:</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>go mod init docker-go-api
</code></pre></div></div>

<h3 id="create-a-maingo-file">Create a <code class="language-plaintext highlighter-rouge">main.go</code> file:</h3>
<p>If you are on linux/mac, use the touch  command:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>touch main.go
</code></pre></div></div>

<p>Add this to your main.go file:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
	<span class="s">"github.com/gin-gonic/gin"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">router</span> <span class="o">:=</span> <span class="n">gin</span><span class="o">.</span><span class="n">Default</span><span class="p">()</span>
	<span class="n">router</span><span class="o">.</span><span class="n">GET</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span> <span class="k">func</span><span class="p">(</span><span class="n">c</span> <span class="o">*</span><span class="n">gin</span><span class="o">.</span><span class="n">Context</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">c</span><span class="o">.</span><span class="n">JSON</span><span class="p">(</span><span class="m">200</span><span class="p">,</span> <span class="n">gin</span><span class="o">.</span><span class="n">H</span><span class="p">{</span>
			<span class="s">"message"</span><span class="o">:</span> <span class="s">"Hello Docker!"</span><span class="p">,</span>
		<span class="p">})</span>
	<span class="p">})</span>
	<span class="n">router</span><span class="o">.</span><span class="n">Run</span><span class="p">()</span> <span class="c">// listens on 0.0.0.0:8080 by default</span>
<span class="p">}</span>

</code></pre></div></div>

<p>The above code imports “gin” to create a small API, with a single endpoint “/”, that returns a JSON message:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{"message": "Hello Docker!"}
</code></pre></div></div>

<p>Run <code class="language-plaintext highlighter-rouge">go mod tidy</code> to automatically import <code class="language-plaintext highlighter-rouge">gin</code> and to update <code class="language-plaintext highlighter-rouge">go.sum</code>.</p>

<p>Now, we are ready to build this.</p>

<h2 id="building-this-image">Building this image</h2>

<p>To build this image, we can use the <code class="language-plaintext highlighter-rouge">docker build</code> command. This will build images from the Dockerfile.</p>

<p>While building the image, you can optionally provide a string name for the name of the image. You can do this using the <code class="language-plaintext highlighter-rouge">--tag</code> flag. Below we will use the <code class="language-plaintext highlighter-rouge">--tag</code> file to name the image as <code class="language-plaintext highlighter-rouge">docker-go-api</code>.</p>

<h3 id="command">Command:</h3>
<p><code class="language-plaintext highlighter-rouge">docker build --tag docker-go-api .</code></p>

<p>The .(dot) at the end tells the image builder to look for dockerfiles in the current directory.</p>

<p>When build is completed successfully, you will see a “Finished” log on your terminal.</p>

<h2 id="viewing-local-images">Viewing local images</h2>

<p>To see the local images that are available/have been built on your machine, you can use <code class="language-plaintext highlighter-rouge">docker image ls</code> command.</p>

<p><code class="language-plaintext highlighter-rouge">docker image ls</code></p>

<p>IMAGE                                    ID             DISK USAGE   CONTENT SIZE   EXTRA   <br />
docker-go-api:latest                0b0a24003886       1.84GB          431MB    U</p>

<h2 id="running-this-container">Running this container:</h2>

<p>We can run the container using the <code class="language-plaintext highlighter-rouge">docker run</code> command. This command takes <code class="language-plaintext highlighter-rouge">image name</code> as the parameter. So, in our case, our command will be:</p>

<p><code class="language-plaintext highlighter-rouge">docker run docker-go-api</code></p>

<h3 id="output">Output:</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --&gt; main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on 0.0.0.0:8080
</code></pre></div></div>

<p>You will see an output similar to the above, and it says that it is serving on localhost:8080. However, when you send a request, or even visit that site through your browser at that port, you will get a “Failed to connect” error.  <code class="language-plaintext highlighter-rouge">This is because by default the container’s network is isolated from the host network.</code> The container can access the outside world, but the host and other machines cannot access the container’s ports unless you publish them.</p>

<p>To publish, you can use the <code class="language-plaintext highlighter-rouge">--publish</code> or just <code class="language-plaintext highlighter-rouge">-p</code> flag with the syntax <code class="language-plaintext highlighter-rouge">host_port:container_port</code> on the <code class="language-plaintext highlighter-rouge">docker run</code> command. So, here, in our case, if we do <code class="language-plaintext highlighter-rouge">3000:8080</code>, when we visit <code class="language-plaintext highlighter-rouge">3000</code> on our local host, our request will be forwarded to <code class="language-plaintext highlighter-rouge">8080</code> of the container’s port, which is where our api server is running. However, to keep it simple for our example, we will keep the host_port the same as the container_port, which is 8080.</p>

<p><code class="language-plaintext highlighter-rouge">docker run -p 8080:8080 docker-go-api</code></p>

<p>So now, when you make a request to <code class="language-plaintext highlighter-rouge">localhost:8080</code>, you will get the response:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{"message":"Hello Docker!"}
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[What is Docker?]]></summary></entry><entry><title type="html">Authentication and Authorization Methods</title><link href="https://coderparth.github.io/2026/01/02/authentication-and-authorization-methods.html" rel="alternate" type="text/html" title="Authentication and Authorization Methods" /><published>2026-01-02T00:00:00+00:00</published><updated>2026-01-02T00:00:00+00:00</updated><id>https://coderparth.github.io/2026/01/02/authentication-and-authorization-methods</id><content type="html" xml:base="https://coderparth.github.io/2026/01/02/authentication-and-authorization-methods.html"><![CDATA[<h1 id="basic-http-authentication-method">Basic HTTP Authentication Method</h1>

<p>In this method:</p>

<ol>
  <li>The client sends the word <strong>“Basic”</strong> followed by the Base64-encoded <code class="language-plaintext highlighter-rouge">&lt;username&gt;:&lt;password&gt;</code> in the standard <strong>Authorization</strong> header.</li>
  <li>The server then matches that username and password against the credentials stored on the server/db.</li>
  <li>If the credentials match, access to the resource is allowed, else, access is denied.</li>
</ol>

<p>In <strong>Basic HTTP Authentication</strong>, each request follows the same methods mentioned above - each request contains <code class="language-plaintext highlighter-rouge">Basic &lt;username&gt;:&lt;password&gt;</code> in the authorization header.</p>

<p>Since this request is sent in Base64-encoded plain text, it is highly vulnerable to security attacks. Although, using <strong>HTTPS</strong> makes it at least usable, it is still considered a very weak authentication method, as <strong>HTTPS</strong> keeps the data encrypted only in transit, not in other places where it is decrypted, such as web browsers, servers, reverse proxies, etc.</p>

<h1 id="bearer-token-based-authentication-method">Bearer-Token-Based Authentication Method</h1>

<p>This method is also a part of the <strong>Basic HTTP Authentication</strong> scheme. In this method:</p>

<ol>
  <li>The client sends a login request, with a username and a password (in the request body).</li>
  <li>Server generates a string (a hexadecimal character string, or a <strong>JWT token</strong> - which has been written about in the next section).</li>
  <li>The client then uses this new string (called <strong>Token</strong>) every time to make authenticated requests - unlike <strong>Basic HTTP</strong>, where username and password were sent in the <strong>Authorization Header</strong> in each request.</li>
</ol>

<p>The generated token is sent in this format in the authorization header:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Authorization: Bearer &lt;token&gt;
</code></pre></div></div>

<h1 id="jwt">JWT</h1>

<p><strong>JWT (JSON Web Token)</strong> is a cryptographically signed JSON object that contains information about the user. <strong>JWT</strong> is commonly used as a bearer token in <strong>Bearer Token Based authentication method</strong>. Using <strong>JWT</strong>, the server can verify the integrity of the request, and get the information about the user.</p>

<p><strong>NOTE:</strong> <code class="language-plaintext highlighter-rouge">JWT is not an encryption, it is a digitally signed token. </code></p>

<p>Because <strong>JWTs</strong> are signed, we can be sure that the senders are who they claim to be, and verify that the content has not been changed.</p>

<h2 id="structure-of-jwt">Structure of JWT</h2>

<p><strong>JWT</strong> consists of 3 parts, separated by dots:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Header.Payload.Signature
</code></pre></div></div>

<h3 id="header">Header</h3>

<p>The header consists of two parts: the type of token (which is <strong>JWT</strong>), and the signing algorithm that is being used, such as <strong>HMAC SHA256</strong> or <strong>RSA</strong>.</p>

<p><strong>Example:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
    “alg”: “HS256”,
    “typ”: “JWT”
}
</code></pre></div></div>

<h3 id="payload">Payload</h3>

<p>Payload is where the main data lives. It generally contains information about a user, and the expiration time for that token. This information/data is also called as <strong>claims</strong>.</p>

<p><strong>Example:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
  "sub": "1234567890", 
  "name": "John Doe",
  "admin": true,
  "iat": 1751494086,
  "exp": 1751497686
}
</code></pre></div></div>

<p>In the above example:</p>
<ul>
  <li><strong>“sub”</strong> stands for subject, and it is commonly set to User ID or some unique data of a user.</li>
  <li><strong>“iat”</strong> is the time the token was issued at.</li>
  <li><strong>“exp”</strong> is the expiration time of that token.</li>
</ul>

<h3 id="signature">Signature</h3>

<p>The signature part is created by taking the encoded header, encoded payload, a secret, the algorithm specified in the header, and then signing it.</p>

<p>Here, a <strong>secret</strong> is like a password that only the server knows.</p>

<p><strong>Example:</strong><br />
If you used <strong>HMAC SHA256</strong> algorithm, the creation of the signature will look like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>HMACSHA256(
    base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)
</code></pre></div></div>
<h1 id="jwt-example-output">JWT Example Output</h1>

<p>This will generate three Base64-URL strings separated by dots. It will look something like this for the example set above:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTc1MTQ5NDA4NiwiZXhwIjoxNzUxNDk3Njg2fQ.XLD0Tg9wzbv3Y3XgjL3fHpsXlIqCWeoNsiYPvyzVnFk
</code></pre></div></div>

<p>Below is an oversimplified example of generating and validating <strong>JWT</strong> in <strong>Go</strong>, using <code class="language-plaintext highlighter-rouge">golang-jwt</code> package.</p>

<h2 id="generating-a-jwt-in-go">Generating a JWT in Go</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">generateJWT</span><span class="p">()</span> <span class="p">(</span><span class="kt">string</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
	<span class="c">// Create a new token with the specified signing method and claims.</span>
	<span class="n">token</span> <span class="o">:=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">NewWithClaims</span><span class="p">(</span><span class="n">jwt</span><span class="o">.</span><span class="n">SigningMethodHS256</span><span class="p">,</span> <span class="c">// This is the Header (the signing method, and the token type)</span>
		<span class="n">jwt</span><span class="o">.</span><span class="n">MapClaims</span><span class="p">{</span> <span class="c">// This is the Payload Section.</span>
			<span class="s">"sub"</span><span class="o">:</span>   <span class="s">"1234567890"</span><span class="p">,</span> <span class="c">// These are the claims about an entity - the user.</span>
			<span class="s">"name"</span><span class="o">:</span>  <span class="s">"John Doe"</span><span class="p">,</span>
			<span class="s">"admin"</span><span class="o">:</span> <span class="no">true</span><span class="p">,</span>
			<span class="s">"iat"</span><span class="o">:</span>   <span class="n">time</span><span class="o">.</span><span class="n">Now</span><span class="p">()</span><span class="o">.</span><span class="n">Unix</span><span class="p">(),</span> <span class="c">// These are the metadata of the token (issue date and expiration time).</span>
			<span class="s">"exp"</span><span class="o">:</span>   <span class="n">time</span><span class="o">.</span><span class="n">Now</span><span class="p">()</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="m">5</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Minute</span><span class="p">)</span><span class="o">.</span><span class="n">Unix</span><span class="p">(),</span>
		<span class="p">})</span>

	<span class="c">// Convert the token into a string format.</span>
	<span class="n">tokenString</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">token</span><span class="o">.</span><span class="n">SignedString</span><span class="p">([]</span><span class="kt">byte</span><span class="p">(</span><span class="n">JWT_SECRET</span><span class="p">))</span> <span class="c">// JWT_SECRET is loaded as an environment variable.</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="k">return</span> <span class="s">""</span><span class="p">,</span> <span class="n">err</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="n">tokenString</span><span class="p">,</span> <span class="no">nil</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="parsing-and-validating-a-jwt-in-go">Parsing and Validating a JWT in Go</h2>

<p>An oversimplified example of a function for parsing and validating a JWT in Go, using <code class="language-plaintext highlighter-rouge">golang-jwt</code>:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">parseAndValidateJWT</span><span class="p">()</span> <span class="p">(</span><span class="n">jwt</span><span class="o">.</span><span class="n">MapClaims</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
	<span class="c">// Token string generated from the previous generateJWT() function.</span>
	<span class="n">tokenString</span> <span class="o">:=</span> <span class="s">"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiZXhwIjoxNzY3MjY0MjkwLCJpYXQiOjE3NjcyNjM5OTAsIm5hbWUiOiJKb2huIERvZSIsInN1YiI6IjEyMzQ1Njc4OTAifQ.qR3WwHotE4u3PrZLCRCkMVsvIOn9rcPW5sLPHdGVbRU"</span>

	<span class="c">// Parse, validate, and verify the signature</span>
	<span class="c">// jwt.Parse takes a token string, and a keyFunc as arguments.</span>
	<span class="c">// The keyFunc should return the cryptographic key, which was used for signing.</span>
	<span class="n">token</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">tokenString</span><span class="p">,</span> <span class="k">func</span><span class="p">(</span><span class="n">token</span> <span class="o">*</span><span class="n">jwt</span><span class="o">.</span><span class="n">Token</span><span class="p">)</span> <span class="p">(</span><span class="n">any</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">return</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">(</span><span class="n">JWT_SECRET</span><span class="p">),</span> <span class="no">nil</span> <span class="c">// JWT_SECRET is loaded as an environment variable.</span>
	<span class="p">},</span> <span class="n">jwt</span><span class="o">.</span><span class="n">WithValidMethods</span><span class="p">([]</span><span class="kt">string</span><span class="p">{</span><span class="n">jwt</span><span class="o">.</span><span class="n">SigningMethodHS256</span><span class="o">.</span><span class="n">Alg</span><span class="p">()}))</span> <span class="c">// Validate if 'alg' claimed in the token matches the expected algorithm.</span>

	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">err</span>
	<span class="p">}</span>

	<span class="n">claims</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="n">token</span><span class="o">.</span><span class="n">Claims</span><span class="o">.</span><span class="p">(</span><span class="n">jwt</span><span class="o">.</span><span class="n">MapClaims</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">ok</span> <span class="p">{</span>
		<span class="k">return</span> <span class="n">claims</span><span class="p">,</span> <span class="no">nil</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Errorf</span><span class="p">(</span><span class="s">"Error extracting claims"</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>
<h1 id="oauth---an-authorization-method">OAuth - An Authorization Method</h1>

<p>OAuth can be understood with this simple problem scenario: Imagine you want to let a photo editor app get access to your facebook’s profile picture. However, you certainly do not want to provide your login credentials to that photo editor app. <strong>OAuth</strong> comes in to solve problems like these: providing authorization to resources without handing in user credentials.</p>

<h2 id="getting-started-with-oauth">Getting started with OAuth</h2>

<p>All <strong>OAuth providers</strong> such as Github, Google, and Facebook issue a <strong>client ID</strong> and <strong>client secret</strong> to use their OAuth service. As a developer, you need those to get started. Follow the documentation provided on their website to get them.</p>

<p>For example, to get started with using Google’s OAuth service, you can follow this documentation:<br />
<a href="https://developers.google.com/identity/protocols/oauth2">Google OAuth 2.0 Documentation</a></p>

<h2 id="understanding-implementation-with-an-example">Understanding Implementation with an Example</h2>

<p>For an example, let us suppose we have 3 routes: <code class="language-plaintext highlighter-rouge">/login</code>, <code class="language-plaintext highlighter-rouge">/callback</code>, <code class="language-plaintext highlighter-rouge">/profile</code>.</p>

<ol>
  <li>
    <p><strong>/login:</strong> Here, using our <strong>client ID</strong> and <strong>secret</strong>, we can generate a unique OAuth URL, and redirect the user to that URL - which will take them to the OAuth Provider’s website. While creating the redirect OAuth URL, two important variables <code class="language-plaintext highlighter-rouge">state</code> and <code class="language-plaintext highlighter-rouge">verifier</code> are created, which are later used in the <code class="language-plaintext highlighter-rouge">callback</code> to stay protected from CSRF attacks.</p>
  </li>
  <li>
    <p><strong>/callback:</strong> After successful authentication and authorization, the user can be redirected to this route. Here, we can process the redirected callback, and create an account for that user.</p>
  </li>
  <li>
    <p><strong>/profile:</strong> This is our protected resource. After a successful account creation in <code class="language-plaintext highlighter-rouge">/callback</code>, the user can be redirected here.</p>
  </li>
</ol>

<p>In the example, we have set, after a successful login with the OAuth provider, the user is redirected to <code class="language-plaintext highlighter-rouge">/callback</code> URL. The redirect URL contains a <code class="language-plaintext highlighter-rouge">code</code> parameter, which can be used to get an <strong>Access Token</strong> from the OAuth provider, which then canb be used to get the user information from the OAuth provider.</p>

<p><strong>NOTE:</strong> In OAuth protocol, there are 2 access types. When the access type is set to <code class="language-plaintext highlighter-rouge">offline</code>, a <strong>Refresh Token</strong> is provided in addition to the <strong>Access Token</strong>. This <strong>Refresh Token</strong> can be used to generate a new <strong>Access Token</strong> without re-authenticating the user.</p>

<p><strong>NOTE:</strong> To reduce chances of CSRF attack - and to make sure that the browser that started the login is the one finishing it - you can pass a <code class="language-plaintext highlighter-rouge">state</code> variable while generating a unique OAuth URL for that user. Then, after a successful login, when the user is returned to <code class="language-plaintext highlighter-rouge">/callback</code> (you can have a different URL to handle callback, this is what we have set in our example), you can check if the sent state matches the <code class="language-plaintext highlighter-rouge">state</code> that you created. <code class="language-plaintext highlighter-rouge">state</code> is generally a random string.</p>

<h1 id="oauth-in-go-example">OAuth in Go Example</h1>

<p>The following example is implemented in <strong>Go</strong>, with the official OAuth2 implementation package <code class="language-plaintext highlighter-rouge">golang.org/x/oauth2</code>, and the OAuth2 provider package from Google <code class="language-plaintext highlighter-rouge">golang.org/x/oauth2/google</code>.</p>

<p>Code comments have been added to explain each section/part, rather than using separate paragraphs for explanation.</p>

<p><strong>NOTE:</strong> You will need to add <code class="language-plaintext highlighter-rouge">http://localhost:8080/auth/callback</code> to your <strong>Authorized redirect URIs</strong> section for your project in Google console.</p>

<p>Below is an oversimplified way to get the user’s details through <strong>OAuth</strong>, and <strong>Google OAuth API</strong>. It is a <code class="language-plaintext highlighter-rouge">single function</code> that creates an OAuth URL, and prints it to the terminal. You can then copy the URL and paste it to your browser, which will take you to Google’s consent and permission page. After successful consent, you will be forwarded to the <code class="language-plaintext highlighter-rouge">/callback</code> page, which in this case, will fail, as we have not set up a server yet. From the <code class="language-plaintext highlighter-rouge">/callback</code> URL that failed in your browser, copy the value of the <code class="language-plaintext highlighter-rouge">code</code> query, and paste it to the terminal. This code will be used to request a token from the OAuth provider (in this case Google). Once the token is received, a request is made to a Google API endpoint to retrieve the public details of the user.</p>

<p><strong>NOTE:</strong> The function is meant to show the process in which <strong>OAuth</strong> works, and does not include any actual routes or server implementation.</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">initGoogleOauthConfig</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ctx</span> <span class="o">:=</span> <span class="n">context</span><span class="o">.</span><span class="n">Background</span><span class="p">()</span>
	<span class="c">// Prepare Config with the information about our server, and OAuth provider.</span>
	<span class="n">conf</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">oauth2</span><span class="o">.</span><span class="n">Config</span><span class="p">{</span>
		<span class="n">ClientID</span><span class="o">:</span>     <span class="n">os</span><span class="o">.</span><span class="n">Getenv</span><span class="p">(</span><span class="s">"CLIENT_ID"</span><span class="p">),</span>
		<span class="n">ClientSecret</span><span class="o">:</span> <span class="n">os</span><span class="o">.</span><span class="n">Getenv</span><span class="p">(</span><span class="s">"CLIENT_SECRET"</span><span class="p">),</span>
		<span class="n">RedirectURL</span><span class="o">:</span>  <span class="s">"http://localhost:8080/auth/callback"</span><span class="p">,</span>
		<span class="n">Scopes</span><span class="o">:</span>       <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"email"</span><span class="p">,</span> <span class="s">"profile"</span><span class="p">},</span>
		<span class="n">Endpoint</span><span class="o">:</span>     <span class="n">google</span><span class="o">.</span><span class="n">Endpoint</span><span class="p">,</span>
	<span class="p">}</span>

	<span class="c">// use PKCE to protect against CSRF attacks</span>
	<span class="c">// https://www.ietf.org/archive/id/draft-ietf-oauth-security-topics-22.html#name-countermeasures-6</span>
	<span class="c">//</span>
	<span class="c">// Generate a PKCE code verifier with 32 octets of randomness.</span>
	<span class="n">verifier</span> <span class="o">:=</span> <span class="n">oauth2</span><span class="o">.</span><span class="n">GenerateVerifier</span><span class="p">()</span>

	<span class="c">// Create an unique OAuth URL, and redirect user to ask for permission, and consent</span>
	<span class="c">// for the scopes specified above.</span>
	<span class="c">//</span>
	<span class="c">// Below, we are using "state" as the state variable parameter, as an example.</span>
	<span class="c">// Always use a random string in real cases.</span>
	<span class="c">//</span>
	<span class="c">// For the second parameter of AuthCodeURL, we are using AccessTypeOffline to obtain</span>
	<span class="c">// a refresh token, which can then be used to regenerate access tokens.</span>
	<span class="c">//</span>
	<span class="c">// The third argument takes the PKCE verifier that we create above, hashes it using SHA-256,</span>
	<span class="c">// encodes it as Base64 URL. So, the url will contain something like this:</span>
	<span class="c">// &amp;code_challenge=G0XPRtz3fyPcN14e0TmX-Ct2-ZMW_cMssOyoHJ3GBPA</span>
	<span class="c">//</span>
	<span class="n">authUrl</span> <span class="o">:=</span> <span class="n">conf</span><span class="o">.</span><span class="n">AuthCodeURL</span><span class="p">(</span><span class="s">"state"</span><span class="p">,</span> <span class="n">oauth2</span><span class="o">.</span><span class="n">AccessTypeOffline</span><span class="p">,</span> <span class="n">oauth2</span><span class="o">.</span><span class="n">S256ChallengeOption</span><span class="p">(</span><span class="n">verifier</span><span class="p">))</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Visit the URL for the auth dialog: %v"</span><span class="p">,</span> <span class="n">authUrl</span><span class="p">)</span>

	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">""</span><span class="p">)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"Please copy and paste the code from the redirect URL in the browser: "</span><span class="p">)</span>

	<span class="c">// Copy the code from the redirect URL in the browser.</span>
	<span class="k">var</span> <span class="n">enterCode</span> <span class="kt">string</span>
	<span class="c">// Wait for the user to type in code in the terminal</span>
	<span class="k">if</span> <span class="n">_</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">enterCode</span><span class="p">);</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="n">code</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">url</span><span class="o">.</span><span class="n">QueryUnescape</span><span class="p">(</span><span class="n">enterCode</span><span class="p">)</span> <span class="c">// decode %2F → /</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="s">"Failed to decode code:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="c">// Send a request to the OAuth provider for the token.</span>
	<span class="c">// Since, we are using PKCE, we have included a VerifierOption as the third argument.</span>
	<span class="n">tok</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">conf</span><span class="o">.</span><span class="n">Exchange</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">oauth2</span><span class="o">.</span><span class="n">VerifierOption</span><span class="p">(</span><span class="n">verifier</span><span class="p">))</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="c">// Attach access token to all the requests that are going to be made.</span>
	<span class="n">client</span> <span class="o">:=</span> <span class="n">conf</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">tok</span><span class="p">)</span>

	<span class="c">// Get the user public details from google API endpoint</span>
	<span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">client</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://www.googleapis.com/oauth2/v2/userinfo"</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Error: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

	<span class="k">var</span> <span class="n">v</span> <span class="n">any</span>

	<span class="c">// Read the JSON body using JSON decoder</span>
	<span class="n">err</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">NewDecoder</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span><span class="o">.</span><span class="n">Decode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">v</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Error: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="c">// Print all the details of the user</span>
	<span class="c">// (for demonstration only)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"%v"</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[Basic HTTP Authentication Method]]></summary></entry><entry><title type="html">Different Types of Tests and their Implementation Example in Go</title><link href="https://coderparth.github.io/2026/01/02/common-types-of-tests-and-their-implementations.html" rel="alternate" type="text/html" title="Different Types of Tests and their Implementation Example in Go" /><published>2026-01-02T00:00:00+00:00</published><updated>2026-01-02T00:00:00+00:00</updated><id>https://coderparth.github.io/2026/01/02/common-types-of-tests-and-their-implementations</id><content type="html" xml:base="https://coderparth.github.io/2026/01/02/common-types-of-tests-and-their-implementations.html"><![CDATA[<p><strong>NOTE:</strong> The aim of this post is to explain common types of tests in the simplest and easiest words, without diving too deep.</p>

<h2 id="unit-test">Unit test</h2>
<p>A unit test is a way of testing where the smallest unit of code is tested to see if it works correctly. This smallest part is usually a function, a method, or a code block.</p>

<p>Below is an oversimplified example of a unit test in Go.</p>

<p>Here, we have a function <code class="language-plaintext highlighter-rouge">add</code>, and two corresponding unit tests: (1) <code class="language-plaintext highlighter-rouge">TestAddPositive</code>, and (2) <code class="language-plaintext highlighter-rouge">TestAddNegative</code>.</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="s">"testing"</span>

<span class="k">func</span> <span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
	<span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">TestAddPositive</span><span class="p">(</span><span class="n">t</span> <span class="o">*</span><span class="n">testing</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">sum</span> <span class="o">:=</span> <span class="n">add</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">sum</span> <span class="o">!=</span> <span class="m">5</span> <span class="p">{</span>
		<span class="n">t</span><span class="o">.</span><span class="n">Errorf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Expected: %v </span><span class="se">\n</span><span class="s">Received: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">TestAddNegative</span><span class="p">(</span><span class="n">t</span> <span class="o">*</span><span class="n">testing</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">sum</span> <span class="o">:=</span> <span class="n">add</span><span class="p">(</span><span class="o">-</span><span class="m">2</span><span class="p">,</span> <span class="o">-</span><span class="m">3</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">sum</span> <span class="o">!=</span> <span class="o">-</span><span class="m">5</span> <span class="p">{</span>
		<span class="n">t</span><span class="o">.</span><span class="n">Errorf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Expected: %v </span><span class="se">\n</span><span class="s">Received: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
	<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Unit tests are a great way to quickly pinpoint to the exact part of the code, when an error occurs, especially during testing. It also helps to quickly catch regression-based bugs, which are bugs that are produced from recent code changes.</p>

<h2 id="integration-test">Integration test</h2>
<p>Integration testing is a way of testing where different components are integrated and tested to see if it works correctly.</p>

<p>Example: Let us say you have 2 functions:<br />
(1) <code class="language-plaintext highlighter-rouge">CreateOrder</code> function that creates an order.<br />
(2) <code class="language-plaintext highlighter-rouge">SaveOrder</code> function that saves the order to your database.</p>

<p>If you integrate them, and then test them together, that is an integration test. Below is an oversimplified example to demonstrate this:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="n">Order</span> <span class="k">struct</span> <span class="p">{</span>
	<span class="n">Name</span>  <span class="kt">string</span>
	<span class="n">Price</span> <span class="kt">float64</span>
<span class="p">}</span>

<span class="c">// A slice of Orders to simulate a database.</span>
<span class="k">var</span> <span class="n">orders</span> <span class="p">[]</span><span class="n">Order</span>

<span class="c">// createOrder creates an instance of an Order.</span>
<span class="k">func</span> <span class="n">createOrder</span><span class="p">()</span> <span class="n">Order</span> <span class="p">{</span>
	<span class="k">return</span> <span class="n">Order</span><span class="p">{</span>
		<span class="n">Name</span><span class="o">:</span>  <span class="s">"Headphone"</span><span class="p">,</span>
		<span class="n">Price</span><span class="o">:</span> <span class="m">50.00</span><span class="p">,</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="c">// saveOrder appends it to the 'orders' slice.</span>
<span class="c">// It simulates a database for this example.</span>
<span class="k">func</span> <span class="n">saveOrder</span><span class="p">(</span><span class="n">o</span> <span class="n">Order</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">orders</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">orders</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">TestCreateAndSaveOrder</span><span class="p">(</span><span class="n">t</span> <span class="o">*</span><span class="n">testing</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">order</span> <span class="o">:=</span> <span class="n">createOrder</span><span class="p">()</span>
	<span class="n">saveOrder</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>

	<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">orders</span><span class="p">)</span> <span class="o">&lt;</span> <span class="m">0</span> <span class="p">{</span>
		<span class="n">t</span><span class="o">.</span><span class="n">Errorf</span><span class="p">(</span><span class="s">"Order did not get saved correctly."</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="k">if</span> <span class="n">orders</span><span class="p">[</span><span class="m">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">order</span> <span class="p">{</span>
		<span class="n">t</span><span class="o">.</span><span class="n">Errorf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Expected: %v </span><span class="se">\n</span><span class="s">Received: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">order</span><span class="p">,</span> <span class="n">orders</span><span class="p">[</span><span class="m">0</span><span class="p">])</span>
	<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="end-to-end-test">End-to-End Test</h2>

<p>The end-to-end test is best understood with an example. Imagine, you have a Login webpage for your website, and you want to test it. Here, in this case, the end-to-end test will be written in a way such that login details are automatically filled, and the login button is automatically clicked. In other words, the interaction with that webpage is done just like a real user. Furthermore, the end-to-end test will ensure that interaction with the error messages, responses, url redirects, database updates, etc are all done correctly, and automatically.</p>

<p>To achieve this kind of testing, tools like <strong>“Selenium”</strong> are commonly used. <strong>“Selenium”</strong> can drive a web browser natively, just like a user would.</p>

<p>Below is an official link from Selenium to get you started:<br />
<a href="https://www.selenium.dev/documentation/webdriver/getting_started/">https://www.selenium.dev/documentation/webdriver/getting_started/</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[NOTE: The aim of this post is to explain common types of tests in the simplest and easiest words, without diving too deep.]]></summary></entry><entry><title type="html">An Intro to Relational Database and SQL</title><link href="https://coderparth.github.io/2025/12/29/an-intro-to-relational-database-and-sql.html" rel="alternate" type="text/html" title="An Intro to Relational Database and SQL" /><published>2025-12-29T00:00:00+00:00</published><updated>2025-12-29T00:00:00+00:00</updated><id>https://coderparth.github.io/2025/12/29/an-intro-to-relational-database-and-sql</id><content type="html" xml:base="https://coderparth.github.io/2025/12/29/an-intro-to-relational-database-and-sql.html"><![CDATA[<p><strong>What is a relational database?</strong><br />
A relational database is a type of database, where data is stored in rows and columns, which collectively form multiple tables. Data from these tables can be linked using primary key or foreign keys.</p>

<p><strong>What is a primary key?</strong><br />
A primary key is a column in a table that uniquely identifies each row. In the example presented below, the id column is a primary key for the table <strong>“Users”</strong>.</p>

<p><strong>An example of a table (called Users) in a relational database:</strong></p>

<table>
  <thead>
    <tr>
      <th>Users</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>user_id (Primary key)</td>
    </tr>
    <tr>
      <td>name</td>
    </tr>
    <tr>
      <td>email</td>
    </tr>
  </tbody>
</table>

<p>A column containing unique numeric values (integers) are generally used as a primary key because RDBMs systems can process them more quickly.</p>

<p><strong>What is a foreign key?</strong><br />
A foreign key in one table refers to the primary key of another table and is used to link between the tables.</p>

<p><strong>An example of a table called Orders, showing a foreign key:</strong></p>

<table>
  <thead>
    <tr>
      <th>Orders</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>order_id (Primary Key)</td>
    </tr>
    <tr>
      <td>user_id (Foreign Key)</td>
    </tr>
  </tbody>
</table>

<p><strong>Transactions in a relational database</strong><br />
Relational databases are associated with transactional databases, and it is an important concept to understand. A transaction in a database is a series of operations that are performed as if they are one single operation. Either all of them are saved in the database after they are performed, or none of them are saved.</p>

<p><strong>An easy to understand example is a transaction in a banking system.</strong> Let us say, A is transferring money to B.</p>

<p><strong>Steps in which that happens:</strong></p>
<ol>
  <li>A transfers $5 to B, so $5 is deducted from A’s account.</li>
  <li>In the second step, $5 is added to B’s account.</li>
</ol>

<p>This is where a transaction comes in: either results from both of these actions are saved, or none of them are saved. If a connection error or server outage would happen in between, the database would cancel the transaction: no action would be saved.</p>

<p>The properties of transactions are represented by the acronym <strong>ACID</strong>. These properties are explained below:</p>

<p><strong>Atomic:</strong> All changes are performed as a single operation, and either all of the operations are performed and saved, or none of them are.</p>

<p><strong>Consistency:</strong> Database stays in a correct state before and after a transaction.</p>

<p><strong>Isolation:</strong> Each transaction is isolated, so it acts like only one transaction is happening at a time.</p>

<p><strong>Durability:</strong> After a successful transaction, data persists, even in the event of a system failure.</p>

<p><strong>What is a RDBMS (Relational Database Management System)?</strong><br />
RDBMS is the underlying software that manages relational databases, organizing data into rows and columns, and allowing users to perform CRUD (Create, Ready, Update, Delete) operations on it.  Examples: <strong>MySQL, PostgreSQL, Oracle, etc.</strong></p>

<p><strong>What is SQL?</strong><br />
SQL (Structured Query Language) is the standard programming language used for interacting with RDBMSs. SQL queries allow an easy way to perform CRUD operations over a relational database.</p>

<p><strong>Below is an intro to SQL, with simple examples:</strong><br />
<strong>NOTE:</strong> The following examples were run in <code class="language-plaintext highlighter-rouge">PostgreSQL</code>.</p>

<p><strong>Create a table:</strong><br />
Define a table, and its structure</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">users</span> <span class="p">(</span>
<span class="n">user_id</span> <span class="nb">serial</span> <span class="k">primary</span> <span class="k">key</span><span class="p">,</span>  
<span class="n">name</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">80</span><span class="p">),</span> 
<span class="n">email</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">unique</span> 
<span class="p">);</span>
</code></pre></div></div>

<p>This creates a <strong>“users”</strong> table with three columns: <strong>user_id</strong>, <strong>name</strong>, and <strong>email</strong>.<br />
<strong>serial:</strong>  indicates primary key for users, and “serial” indicates autoincrementing four-byte integer<br />
<strong>varchar(n):</strong>  variable length char string of length n.</p>

<p><strong>Remove a table:</strong></p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">DROP</span> <span class="k">TABLE</span> <span class="n">users</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Populate a table with rows:</strong></p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">users</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">email</span><span class="p">)</span>
<span class="k">VALUES</span> <span class="p">(</span><span class="err">‘</span><span class="n">john</span><span class="err">’</span><span class="p">,</span> <span class="err">‘</span><span class="n">john22</span><span class="o">@</span><span class="n">gmail</span><span class="p">.</span><span class="n">com</span><span class="err">’</span><span class="p">);</span>
</code></pre></div></div>
<p>The above statement adds a new row to the users table with name <strong>‘john’</strong>, and email <strong>‘john22@gmail.com’</strong>.</p>

<p><strong>Querying a table:</strong></p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">users</span><span class="p">;</span>
</code></pre></div></div>
<p>‘*’ is a shorthand for all columns.</p>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> user_id | name |      email       
---------+------+------------------
       1 | John   |    john22@gmail.com
(1 row)
</code></pre></div></div>

<p><strong>NOTE:</strong> <code class="language-plaintext highlighter-rouge">SELECT *</code> is considered bad in production code, because adding a column would affect/change the results.</p>

<p>So if you wanted just the column <strong>“name”</strong>, you could do:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span> <span class="k">FROM</span> <span class="n">users</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>name 
------
John
(1 row)
</code></pre></div></div>

<p>To get more than one column, use comma:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">email</span> <span class="k">FROM</span> <span class="n">users</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>name  |      email       
------+------------------
 John | john22@gmail.com
(1 row)
</code></pre></div></div>

<p>To introduce new SQL keywords – <strong>AS</strong>, <strong>WHERE</strong>, and <strong>ORDER BY</strong> – I have prepared a new table with new data.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      name      | price  | discount 
----------------+--------+----------
 Iphone 8       | 500.00 |    10.00
 Ipad           | 300.00 |    20.00
 Acer monitor   | 200.00 |    33.00
 Magni Keyboard | 200.00 |    33.00
(4 rows)
</code></pre></div></div>

<p><strong>AS Keyword:</strong><br />
For the table above, you can write an expression that applies a discount to the current price, and then returns the product and the new discounted price as <strong>“discount price”</strong>, using the <strong>“AS”</strong> keyword.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">ROUND</span><span class="p">(</span><span class="n">price</span> <span class="o">-</span> <span class="p">((</span><span class="n">discount</span> <span class="o">/</span> <span class="mi">100</span><span class="p">)</span> <span class="o">*</span> <span class="n">price</span><span class="p">))</span> <span class="k">AS</span> <span class="n">discount_price</span> 
<span class="k">FROM</span> <span class="n">products</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      name      | discount_price 
----------------+----------------
 Iphone 8       |            450
 Ipad           |            240
 Acer monitor   |            134
 Magni Keyboard |            134
(4 rows)
</code></pre></div></div>

<p><strong>WHERE:</strong><br />
WHERE can be used to retrieve only those rows that satisfy your mentioned conditions.<br />
<strong>Example:</strong></p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">price</span> 
<span class="k">FROM</span> <span class="n">products</span> 
<span class="k">WHERE</span> <span class="n">price</span> <span class="o">&lt;=</span> <span class="mi">200</span><span class="p">;</span>
</code></pre></div></div>
<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      name      | price  
----------------+--------
 Acer monitor   | 200.00
 Magni Keyboard | 200.00
(2 rows)
</code></pre></div></div>

<p><strong>ORDER BY:</strong><br />
You can use ORDER BY to retrieve your results in a sorted order.<br />
Example shows retrieving the products sorted according to the price.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">price</span> 
<span class="k">FROM</span> <span class="n">products</span> 
<span class="k">ORDER</span> <span class="k">BY</span> <span class="n">price</span><span class="p">;</span>
</code></pre></div></div>
<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      name      | price  
----------------+--------
 Acer monitor   | 200.00
 Magni Keyboard | 200.00
 Ipad           | 300.00
 Iphone 8       | 500.00
(4 rows)
</code></pre></div></div>

<p><strong>JOIN:</strong><br />
JOIN allows you to combine rows from two or more tables, based on a column related between them.<br />
<strong>Example:</strong></p>

<p><strong>Users table</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> user_id | name |      email       
---------+------+------------------
       1 | John | john22@gmail.com
(1 row)
</code></pre></div></div>

<p><strong>Orders table</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> order_id | customer_id | order_date 
----------+-------------+------------
        1 |           1 | 2025-12-27
(1 row)
</code></pre></div></div>

<p><strong>Join operation:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">u</span><span class="p">.</span><span class="n">user_id</span><span class="p">,</span> <span class="n">u</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">u</span><span class="p">.</span><span class="n">email</span><span class="p">,</span> <span class="n">o</span><span class="p">.</span><span class="n">order_id</span><span class="p">,</span> <span class="n">o</span><span class="p">.</span><span class="n">order_date</span> 
<span class="k">FROM</span> <span class="n">users</span> <span class="n">u</span> 
<span class="k">JOIN</span> <span class="n">orders</span> <span class="n">o</span> 
<span class="k">ON</span> <span class="n">u</span><span class="p">.</span><span class="n">user_id</span> <span class="o">=</span> <span class="n">o</span><span class="p">.</span><span class="n">customer_id</span><span class="p">;</span>
</code></pre></div></div>

<p>In the above example we have introduced <code class="language-plaintext highlighter-rouge">aliases</code> by relabeling <strong>u</strong> for users and <strong>o</strong> for orders.</p>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> user_id | name |      email       | order_id | order_date 
---------+------+------------------+----------+------------
       1 | John | john22@gmail.com |        1 | 2025-12-27
(1 row)
</code></pre></div></div>

<p>Join by default is <strong>INNER JOIN</strong>. Here, INNER JOIN returns only those users that actually have an order.</p>

<p>If we wanted all the users – even those users who did not have an order – we would use <strong>LEFT JOIN</strong>.<br />
<strong>Example query and output:</strong></p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">users</span> <span class="n">u</span> 
<span class="k">LEFT</span> <span class="k">JOIN</span> <span class="n">orders</span> <span class="n">o</span> 
<span class="k">ON</span> <span class="n">u</span><span class="p">.</span><span class="n">user_id</span> <span class="o">=</span> <span class="n">o</span><span class="p">.</span><span class="n">customer_id</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> user_id | name |      email       | order_id | customer_id | order_date 
---------+------+------------------+----------+-------------+------------
       1 | John | john22@gmail.com |        1 |           1 | 2025-12-27
       2 | Ren  | ren212@gmail.com |          |             | 
(2 rows)
</code></pre></div></div>

<p><strong>Aggregate functions:</strong><br />
An <strong>aggregate function</strong> calculates a single result from multiple input rows. Examples of aggregate functions, and their use cases are mentioned below:</p>

<p><strong>COUNT():</strong> Count returns the number of rows.</p>

<p><code class="language-plaintext highlighter-rouge">COUNT(*)</code> -&gt; Returns total number of rows for that table, including rows that have null values.</p>

<p><strong>Example query:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> count 
-------
     4
(1 row)
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">COUNT(column_name)</code> -&gt; Returns total number of rows, excluding rows where that column is null.</p>

<p><strong>Example query:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="k">COUNT</span><span class="p">(</span><span class="n">price</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>SUM():</strong> Returns the total sum of a column from the selected table.</p>

<p><strong>Example query:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="k">SUM</span><span class="p">(</span><span class="n">price</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>   sum   
---------
 1200.00
(1 row)
</code></pre></div></div>

<p><strong>AVG():</strong> Returns the average value of a column from the selected table.</p>

<p><strong>Example query:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">ROUND</span><span class="p">(</span><span class="k">AVG</span><span class="p">(</span><span class="n">price</span><span class="p">))</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> round 
-------
   300
(1 row)
</code></pre></div></div>

<p><strong>MIN():</strong> Returns the smallest value of a column from the selected table.</p>

<p><strong>Example query:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="k">MIN</span><span class="p">(</span><span class="n">price</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  min   
--------
 200.00
(1 row)
</code></pre></div></div>

<p><strong>MAX():</strong> Returns the largest value of a column from the selected table.</p>

<p><strong>Example query:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="k">MAX</span><span class="p">(</span><span class="n">price</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  max   
--------
 500.00
(1 row)
</code></pre></div></div>
<p><strong>Sub-queries:</strong></p>

<p>The above queries that utilised aggregate functions MAX and MIN only provided one value from the column that we asked. What if I want all the columns or specific columns from that specific row with the smallest value or the max value? This is where sub-queries come in to help.</p>

<p><strong>Example:</strong><br />
I want name, price, and discount columns for rows that have the smallest price. I can do a query like this:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">discount</span> 
<span class="k">FROM</span> <span class="n">products</span> 
<span class="k">WHERE</span> <span class="n">price</span> <span class="o">=</span> <span class="p">(</span><span class="k">SELECT</span> <span class="k">MIN</span><span class="p">(</span><span class="n">price</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">);</span> <span class="c1">-- This is a sub query.</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      name      | price  | discount 
----------------+--------+----------
 Acer monitor   | 200.00 |    33.00
 Magni Keyboard | 200.00 |    33.00
(2 rows)
</code></pre></div></div>

<p>The query at the end, within the brackets, is our sub-query.</p>

<p>Similarly, if we wanted the row with the max price, we could do something like this:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">discount</span> 
<span class="k">FROM</span> <span class="n">products</span> 
<span class="k">WHERE</span> <span class="n">price</span> <span class="o">=</span> <span class="p">(</span><span class="k">SELECT</span> <span class="k">MAX</span><span class="p">(</span><span class="n">price</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">products</span><span class="p">);</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>   name   | price  | discount 
----------+--------+----------
 Iphone 8 | 500.00 |    10.00
(1 row)
</code></pre></div></div>

<p><strong>GROUP BY:</strong></p>

<p>For tables with multiple rows that have some common column values, such as the name of the student in the scores table, <strong>GROUP BY</strong> groups those rows first, and then applies your aggregate function. <strong>GROUP BY</strong> is often used with aggregate functions.</p>

<p><strong>Example of a scores table:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> name  | score |      course      
-------+-------+------------------
 Ren   |    92 | Chemistry
 Nancy |    85 | Physics
 Nancy |    91 | Biology
 Ren   |    84 | Biology
 Linus |    95 | Computer Science
 Linus |    99 | Mathematics
(6 rows)
</code></pre></div></div>

<p>Let us say, we want the average score of each student. We could do something like this:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">ROUND</span><span class="p">(</span><span class="k">AVG</span><span class="p">(</span><span class="n">score</span><span class="p">))</span> 
<span class="k">FROM</span> <span class="n">scores</span> 
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">name</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> name  | avg 
-------+-----
 Nancy |  88
 Linus |  97
 Ren   |  88
(3 rows)
</code></pre></div></div>

<p>Here, <strong>GROUP BY</strong> first groups the students according to the name, and then the aggregate function is applied.</p>

<p><strong>NOTE:</strong> First <strong>GROUP BY</strong> is executed, which groups the rows according to the same values of the specified column, and then the aggregate function is executed on top of those grouped rows.</p>

<p><strong>HAVING:</strong></p>

<p><strong>Having</strong> can be used to filter rows that are grouped and aggregated. In other words, in a SQL query, “<strong>HAVING</strong>” is executed only after <strong>GROUP BY</strong> and an aggregation function is executed.</p>

<p>For example, we can use the SQL query we wrote above, to return only those rows where the average score is greater than 90:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="n">ROUND</span><span class="p">(</span><span class="k">AVG</span><span class="p">(</span><span class="n">score</span><span class="p">))</span> <span class="k">AS</span> <span class="k">avg</span> 
<span class="k">FROM</span> <span class="n">scores</span> 
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">name</span> 
<span class="k">HAVING</span> <span class="n">ROUND</span><span class="p">(</span><span class="k">AVG</span><span class="p">(</span><span class="n">score</span><span class="p">))</span> <span class="o">&gt;=</span> <span class="mi">90</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> name  | avg 
-------+-----
 Linus |  97
(1 row)
</code></pre></div></div>

<p><strong>FILTER:</strong></p>

<p><strong>Filter</strong> is a pre-aggregation method, meaning, it runs before aggregation is executed. It runs after grouping is executed, and allows you to apply aggregation only on the certain rows, according to your specifications.</p>

<p>While writing a query, <strong>FILTER</strong> expects to be followed by an aggregation function.</p>

<p>Let us say, we want the total number of courses where each student has achieved greater than 95, we could do something like this:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">name</span><span class="p">,</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> 
<span class="n">FILTER</span> <span class="p">(</span><span class="k">WHERE</span> <span class="n">score</span> <span class="o">&gt;</span> <span class="mi">95</span><span class="p">)</span> 
<span class="k">FROM</span> <span class="n">scores</span> 
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">name</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Output:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> name  | count 
-------+-------
 Nancy |     0
 Linus |     1
 Ren   |     0
(3 rows)
</code></pre></div></div>

<p>Here, grouping is done first, and then the aggregation function <code class="language-plaintext highlighter-rouge">COUNT(*)</code> is applied only on those rows where the filter condition matches.</p>

<p><strong>UPDATES:</strong></p>

<p><strong>UPDATE</strong> allows you to update existing rows in a table.</p>

<p>Let us apply this to our ‘scores’ table again.</p>

<p><strong>Original scores table:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> name  | score |      course      
-------+-------+------------------
 Ren   |    92 | Chemistry
 Nancy |    85 | Physics
 Nancy |    91 | Biology
 Ren   |    84 | Biology
 Linus |    95 | Computer Science
 Linus |    99 | Mathematics
(6 rows)
</code></pre></div></div>

<p>For our scores table, let us say, we want to update the name of “Ren” to “Renu”.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">UPDATE</span> <span class="n">scores</span> 
<span class="k">SET</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'Renu'</span> 
<span class="k">WHERE</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'Ren'</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Updated scores table:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> name  | score |      course      
-------+-------+------------------
 Nancy |    85 | Physics
 Nancy |    91 | Biology
 Linus |    95 | Computer Science
 Linus |    99 | Mathematics
 Renu  |    92 | Chemistry
 Renu  |    84 | Biology
(6 rows)
</code></pre></div></div>

<hr />

<p><strong>Delete:</strong></p>

<p><strong>Delete</strong> allows you to delete existing rows from a table.</p>

<p><strong>NOTE:</strong> Delete commands do not ask for confirmation, so you must be careful when executing them.</p>

<p><strong>Example:</strong> To delete all the rows of “Nancy”, we could do something like this:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">DELETE</span> <span class="k">FROM</span> <span class="n">scores</span> 
<span class="k">WHERE</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'Nancy'</span><span class="p">;</span>
</code></pre></div></div>

<p><strong>Transactions:</strong></p>

<p>Like explained on the top of this post, a <strong>transaction</strong> in a database is a series of operations that are performed as if they are one single operation. Either all of them are saved in the database after they are performed, or none of them are saved.</p>

<p>In PostgreSQL, <code class="language-plaintext highlighter-rouge">BEGIN</code> and <code class="language-plaintext highlighter-rouge">COMMIT</code> commands are used to set up a transaction.<br />
All the SQL commands of a transaction are surrounded by <code class="language-plaintext highlighter-rouge">BEGIN</code> and <code class="language-plaintext highlighter-rouge">COMMIT</code> commands.</p>

<p>To proceed, an example of an accounts table has been created.</p>

<p><strong>Original accounts table:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> name | balance 
------+---------
 A    |  100.00
 B    |  100.00
(2 rows)
</code></pre></div></div>

<p>Here, we will:</p>
<ul>
  <li>Deduct 100 from A’s account balance.</li>
  <li>Add 100 to B’s account balance.</li>
</ul>

<p><strong>Example query:</strong></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">BEGIN</span><span class="p">;</span>                 

<span class="k">UPDATE</span> <span class="n">accounts</span> <span class="k">SET</span> <span class="n">balance</span> <span class="o">=</span> <span class="n">balance</span> <span class="o">-</span> <span class="mi">100</span><span class="p">.</span><span class="mi">00</span> 
<span class="k">WHERE</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'A'</span> <span class="k">AND</span> <span class="n">balance</span> <span class="o">&gt;</span> <span class="mi">100</span><span class="p">;</span>

<span class="k">UPDATE</span> <span class="n">accounts</span> <span class="k">SET</span> <span class="n">balance</span> <span class="o">=</span> <span class="n">balance</span> <span class="o">+</span> <span class="mi">100</span><span class="p">.</span><span class="mi">00</span> 
<span class="k">WHERE</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'B'</span><span class="p">;</span>

<span class="k">COMMIT</span><span class="p">;</span>
</code></pre></div></div>

<p>If the server had crashed after the first update, then on restart, the database would roll back the transaction.</p>

<p>In the above query, if account ‘A’ did not have enough balance, the first query would not update any rows. However, the second query would still run and credit B’s account with 100. Despite no rows being updated from the first query, it would still be regarded as a valid transaction. You can check for errors or perform validation during the transaction, and can abort the transaction using <strong>ROLLBACK</strong>.</p>

<p><strong>Rollbacks</strong> are generally explicitly initiated from the backend if a validation or a conditional check fails during mid-transaction.</p>

<p>Below is an over-simplified example where the transaction is set to roll back if any validation fails or if an error occurs. The example below is written in <strong>Go</strong>, for the <code class="language-plaintext highlighter-rouge">accounts</code> table that was shown in the previous example.</p>

<p><strong>Go Code Example:</strong></p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">transferMoney</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">tx</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">db</span><span class="o">.</span><span class="n">Begin</span><span class="p">()</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Error: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
		<span class="k">return</span>
	<span class="p">}</span>
	<span class="k">defer</span> <span class="n">tx</span><span class="o">.</span><span class="n">Rollback</span><span class="p">()</span> <span class="c">// defer a roll back in case anything fails.</span>

	<span class="k">var</span> <span class="n">balance</span> <span class="kt">float64</span> <span class="c">// Get the current balance of account A.</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">tx</span><span class="o">.</span><span class="n">QueryRow</span><span class="p">(</span><span class="s">"SELECT balance FROM accounts WHERE name = 'A'"</span><span class="p">)</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">balance</span><span class="p">);</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="k">if</span> <span class="n">err</span> <span class="o">==</span> <span class="n">sql</span><span class="o">.</span><span class="n">ErrNoRows</span> <span class="p">{</span> <span class="c">// Confirm that the account exists.</span>
			<span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Account 'A' does not exist."</span><span class="p">)</span>
			<span class="k">return</span>
		<span class="p">}</span>
	<span class="p">}</span>

	<span class="k">if</span> <span class="n">balance</span> <span class="o">&lt;</span> <span class="m">100</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Account 'A' has insufficient balance."</span><span class="p">)</span>
		<span class="k">return</span>
	<span class="p">}</span>

	<span class="c">// Debit 100 from account A.</span>
	<span class="n">_</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="n">Exec</span><span class="p">(</span><span class="s">"UPDATE accounts SET balance = balance - 100 WHERE name = 'A'"</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Error: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
		<span class="k">return</span>
	<span class="p">}</span>

	<span class="c">// Credit 100 from account B.</span>
	<span class="n">_</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="n">Exec</span><span class="p">(</span><span class="s">"UPDATE accounts SET balance = balance + 100 WHERE name = 'B'"</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Error: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
		<span class="k">return</span>
	<span class="p">}</span>

	<span class="c">// Commit the transaction.</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">tx</span><span class="o">.</span><span class="n">Commit</span><span class="p">();</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Error: %v </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
		<span class="k">return</span>
	<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<p><strong>Indexes:</strong></p>

<p><strong>Indexes</strong> allow you to retrieve data more quickly. Think of it as an index in a book.</p>

<p>Indexes can be made using the <code class="language-plaintext highlighter-rouge">CREATE INDEX</code> statement.</p>

<p><strong>Example</strong> of creating an index on <code class="language-plaintext highlighter-rouge">id</code> for the products table:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">INDEX</span> <span class="n">product_id</span> <span class="k">ON</span> <span class="n">products</span><span class="p">(</span><span class="n">id</span><span class="p">);</span>
</code></pre></div></div>

<p><strong>NOTE:</strong> For a table with a small number of rows, the database decides to scan the whole table instead of using an index.</p>

<p><strong>NOTE:</strong> Although indexes make reading/querying faster, updating/writing processes on that table will take longer. This is because indexes will also need an update.</p>

<p><strong>How do you see if the index is being used?</strong></p>
<ul>
  <li>Use the <strong>EXPLAIN</strong> keyword</li>
</ul>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">EXPLAIN</span> <span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">products</span> <span class="k">WHERE</span> <span class="n">id</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
</code></pre></div></div>

<p>You will get an output, similar to this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>                                 QUERY PLAN                                 
----------------------------------------------------------------------------
 Index Scan using product_id on products  (cost=0.29..8.31 rows=1 width=19)
   Index Cond: (id = 5)
(2 rows)
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[What is a relational database? A relational database is a type of database, where data is stored in rows and columns, which collectively form multiple tables. Data from these tables can be linked using primary key or foreign keys.]]></summary></entry><entry><title type="html">N+1 Problem in Simple Words</title><link href="https://coderparth.github.io/2025/12/29/n+1-problem-in-simple-words.html" rel="alternate" type="text/html" title="N+1 Problem in Simple Words" /><published>2025-12-29T00:00:00+00:00</published><updated>2025-12-29T00:00:00+00:00</updated><id>https://coderparth.github.io/2025/12/29/n+1-problem-in-simple-words</id><content type="html" xml:base="https://coderparth.github.io/2025/12/29/n+1-problem-in-simple-words.html"><![CDATA[<p>In simple words, the <strong>N+1 query problem</strong> is a situation where too many queries are being performed, and which could have been solved by making a <strong>single query</strong>.</p>

<p>A simple example:</p>
<ul>
  <li>In the first step, you execute a query to get a list of <strong>users</strong>.</li>
  <li>In the second step, you make individual queries to get a list of <strong>orders</strong> for each single user.</li>
</ul>

<p>Situations like these are exactly where <strong>N+1 query problems</strong> occur. You may think that making many small queries would be faster than making a single large query. <strong>However, the opposite is the truth:</strong> making a large single query is usually faster than many small queries.</p>

<p>An oversimplified code for the above example in <strong>Go (with PostgreSQL)</strong> can be found below:</p>

<p><strong>Bad Example:</strong></p>
<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">// Bad way to make queries; results in N+1 query problem.</span>
<span class="k">func</span> <span class="n">getOrdersForEachUser</span><span class="p">()</span> <span class="p">([]</span><span class="n">CustomerOrder</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">var</span> <span class="n">customerOrders</span> <span class="p">[]</span><span class="n">CustomerOrder</span>
	<span class="c">// Get all the users, and their info.</span>
	<span class="n">userRows</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">db</span><span class="o">.</span><span class="n">Query</span><span class="p">(</span><span class="s">"SELECT * FROM users;"</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">err</span>
		<span class="c">// NOTE: Handle errors gracefully in your code. This function is only an oversimplified example.</span>
	<span class="p">}</span>
	<span class="k">defer</span> <span class="n">userRows</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
	<span class="c">// For each row get the user id, and query for all the orders of that user.</span>
	<span class="k">for</span> <span class="n">userRows</span><span class="o">.</span><span class="n">Next</span><span class="p">()</span> <span class="p">{</span>
		<span class="k">var</span> <span class="n">u</span> <span class="n">User</span>
		<span class="k">if</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">userRows</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">u</span><span class="o">.</span><span class="n">User_id</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">u</span><span class="o">.</span><span class="n">Name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">u</span><span class="o">.</span><span class="n">Email</span><span class="p">);</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
			<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">err</span>
			<span class="c">// NOTE: Handle errors gracefully in your code. This function is only an oversimplified example.</span>
		<span class="p">}</span>
		<span class="c">// Get all the orders of that user.</span>
		<span class="n">orderRows</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">db</span><span class="o">.</span><span class="n">Query</span><span class="p">(</span><span class="s">"SELECT * FROM orders WHERE customer_id = $1;"</span><span class="p">,</span> <span class="n">u</span><span class="o">.</span><span class="n">User_id</span><span class="p">)</span>
		<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
			<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">err</span>
			<span class="c">// NOTE: Handle errors gracefully in your code. This function is only an oversimplified example.</span>
		<span class="p">}</span>
		<span class="n">c</span> <span class="o">:=</span> <span class="n">CustomerOrder</span><span class="p">{</span>
			<span class="n">User</span><span class="o">:</span>   <span class="n">u</span><span class="p">,</span>
			<span class="n">Orders</span><span class="o">:</span> <span class="p">[]</span><span class="n">Order</span><span class="p">{},</span>
		<span class="p">}</span>
		<span class="k">defer</span> <span class="n">orderRows</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
		<span class="k">for</span> <span class="n">orderRows</span><span class="o">.</span><span class="n">Next</span><span class="p">()</span> <span class="p">{</span>
			<span class="k">var</span> <span class="n">o</span> <span class="n">Order</span>
			<span class="k">if</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">orderRows</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">o</span><span class="o">.</span><span class="n">Order_id</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">o</span><span class="o">.</span><span class="n">Customer_id</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">o</span><span class="o">.</span><span class="n">Order_date</span><span class="p">);</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
				<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">err</span>
				<span class="c">// NOTE: Handle errors gracefully in your code. This function is only an oversimplified example.</span>
			<span class="p">}</span>
			<span class="n">c</span><span class="o">.</span><span class="n">Orders</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">Orders</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
		<span class="p">}</span>
		<span class="n">customerOrders</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">customerOrders</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="n">customerOrders</span><span class="p">,</span> <span class="no">nil</span>
<span class="p">}</span>
</code></pre></div></div>
<p>The above example shows <strong>a bad approach</strong>, leading to N+1 problem.</p>

<h2 id="the-better-approach">The Better Approach</h2>
<p>A better approach would be to use a single query. In this case, a <code class="language-plaintext highlighter-rouge">LEFT JOIN</code> operation could easily solve this with a single sql query.</p>

<p>There are multiple ways to do this too, this is just one of the ways:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span> <span class="n">u</span><span class="p">.</span><span class="n">user_id</span><span class="p">,</span> <span class="n">u</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">u</span><span class="p">.</span><span class="n">email</span><span class="p">,</span> <span class="n">o</span><span class="p">.</span><span class="n">order_id</span><span class="p">,</span> <span class="n">o</span><span class="p">.</span><span class="n">order_date</span> 
<span class="k">FROM</span> <span class="n">users</span> <span class="n">u</span> 
<span class="k">LEFT</span> <span class="k">JOIN</span> <span class="n">orders</span> <span class="n">o</span> 
<span class="k">ON</span> <span class="n">u</span><span class="p">.</span><span class="n">user_id</span> <span class="o">=</span> <span class="n">o</span><span class="p">.</span><span class="n">customer_id</span><span class="p">;</span>
</code></pre></div></div>

<p>One of the ways to do this with an oversimplified example in <strong>Go (with PostgreSQL)</strong> can be found below:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">// One of the good ways to do this: using a single SQL query.</span>
<span class="k">func</span> <span class="n">getOrdersForEachUser</span><span class="p">()</span> <span class="p">([]</span><span class="n">CustomerOrder</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">customerOrdersMap</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="o">*</span><span class="n">CustomerOrder</span><span class="p">)</span>
	<span class="c">// Make a single query.</span>
	<span class="n">rows</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">db</span><span class="o">.</span><span class="n">Query</span><span class="p">(</span><span class="s">`
	SELECT u.user_id, u.name, u.email, o.order_id, o.order_date 
	FROM users u 
	LEFT JOIN orders o 
	ON u.user_id = o.customer_id;`</span><span class="p">)</span>

	<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
		<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">err</span>
		<span class="c">// NOTE: Handle errors gracefully in your code. This function is only an oversimplified example.</span>
	<span class="p">}</span>
	<span class="k">defer</span> <span class="n">rows</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

	<span class="k">for</span> <span class="n">rows</span><span class="o">.</span><span class="n">Next</span><span class="p">()</span> <span class="p">{</span>
		<span class="k">var</span> <span class="n">u</span> <span class="n">User</span>
		<span class="k">var</span> <span class="n">o</span> <span class="n">Order</span>
		<span class="k">if</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">rows</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">u</span><span class="o">.</span><span class="n">User_id</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">u</span><span class="o">.</span><span class="n">Name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">u</span><span class="o">.</span><span class="n">Email</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">o</span><span class="o">.</span><span class="n">Order_id</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">o</span><span class="o">.</span><span class="n">Order_date</span><span class="p">);</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
			<span class="k">return</span> <span class="no">nil</span><span class="p">,</span> <span class="n">err</span>
			<span class="c">// NOTE: Handle errors gracefully in your code. This function is only an oversimplified example.</span>
		<span class="p">}</span>
		<span class="c">// Check if this is the first time adding this user to the customerOrdersMap.</span>
		<span class="k">if</span> <span class="n">_</span><span class="p">,</span> <span class="n">exists</span> <span class="o">:=</span> <span class="n">customerOrdersMap</span><span class="p">[</span><span class="n">u</span><span class="o">.</span><span class="n">User_id</span><span class="p">];</span> <span class="o">!</span><span class="n">exists</span> <span class="p">{</span>
			<span class="n">customerOrdersMap</span><span class="p">[</span><span class="n">u</span><span class="o">.</span><span class="n">User_id</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">CustomerOrder</span><span class="p">{</span>
				<span class="n">User</span><span class="o">:</span>   <span class="n">u</span><span class="p">,</span>
				<span class="n">Orders</span><span class="o">:</span> <span class="p">[]</span><span class="n">Order</span><span class="p">{},</span>
			<span class="p">}</span>
		<span class="p">}</span>
		<span class="n">customerOrdersMap</span><span class="p">[</span><span class="n">u</span><span class="o">.</span><span class="n">User_id</span><span class="p">]</span><span class="o">.</span><span class="n">Orders</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">customerOrdersMap</span><span class="p">[</span><span class="n">u</span><span class="o">.</span><span class="n">User_id</span><span class="p">]</span><span class="o">.</span><span class="n">Orders</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
	<span class="p">}</span>

	<span class="n">customerOrders</span> <span class="o">:=</span> <span class="p">[]</span><span class="n">CustomerOrder</span><span class="p">{}</span>
	<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">co</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">customerOrdersMap</span> <span class="p">{</span>
		<span class="n">customerOrders</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">customerOrders</span><span class="p">,</span> <span class="o">*</span><span class="n">co</span><span class="p">)</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="n">customerOrders</span><span class="p">,</span> <span class="no">nil</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Conclusion</strong></p>

<p>Writing your code such that you have a single query that returns all the data you need, instead of executing multiple small queries, can make your reads significantly faster and more efficient.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[In simple words, the N+1 query problem is a situation where too many queries are being performed, and which could have been solved by making a single query.]]></summary></entry><entry><title type="html">What Is a REST API and How to Design It Correctly</title><link href="https://coderparth.github.io/2025/12/27/what-is-a-rest-api-and-how-to-correctly-design-it.html" rel="alternate" type="text/html" title="What Is a REST API and How to Design It Correctly" /><published>2025-12-27T00:00:00+00:00</published><updated>2025-12-27T00:00:00+00:00</updated><id>https://coderparth.github.io/2025/12/27/what-is-a-rest-api-and-how-to-correctly-design-it</id><content type="html" xml:base="https://coderparth.github.io/2025/12/27/what-is-a-rest-api-and-how-to-correctly-design-it.html"><![CDATA[<p><strong>NOTE</strong>: The goal of this blog post is to explain REST API in easy to understand words, like a student’s notes, without diving too deep.</p>

<p><strong>What is REST?</strong><br />
REST stands for Representational State Transfer; it is a set of rules for designing web APIs where data is treated as resources, and HTTP Methods like GET, PUT, POST, and DELETE are used to access them.</p>

<p><strong>What is an API?</strong><br />
API stands for Application Programming Interface; it is a way through which different systems can communicate with each other.  API lets you share your resources while maintaining security and control.</p>

<p>For RESTful APIs, <code class="language-plaintext highlighter-rouge">JSON</code> is usually used as a file format to transfer the information from client to server, and vice versa. This allows RESTful APIs to provide platform independence.</p>

<p>In REST APIs, HTTP methods are used to perform the fundamental data management operations: CRUD (Create, Read, Update, and Delete). Corresponding HTTP methods that are used to perform those operations are mentioned below:</p>

<table>
  <thead>
    <tr>
      <th>Operation</th>
      <th>HTTP Method</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Create</td>
      <td>POST request</td>
    </tr>
    <tr>
      <td>Read</td>
      <td>GET request</td>
    </tr>
    <tr>
      <td>Update</td>
      <td>PUT request</td>
    </tr>
    <tr>
      <td>Delete</td>
      <td>Delete request</td>
    </tr>
  </tbody>
</table>

<p><strong>Designing RESTful APIs correctly:</strong></p>

<p>REST APIs are designed around resources (data), and each resource is represented by a <code class="language-plaintext highlighter-rouge">URI (Uniform Resource Identifier)</code> that uniquely identifies that resource.</p>

<p>Example of a particular user:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://api.bypress.com/users/1
</code></pre></div></div>

<p><strong>Follow the guidelines mentioned below to correctly design APIs:</strong></p>

<ul>
  <li>
    <p><strong><em>Name URIS on <code class="language-plaintext highlighter-rouge">nouns</code> (the resource) and not on verbs (the operations on the resource).</em></strong></p>

    <p>The HTTP methods such as GET, POST, PUT, DELETE, etc imply the verbal action. That is why, adding operation names to URIs are unnecessary.</p>

    <p>Correct and good examples:</p>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  https://api.bypress.com/accounts  // Good
  https://api.bypress.com/reactions // Good
  https://api.bypress.com/reminders // Good
</code></pre></div>    </div>

    <p>Avoid representing operations, and avoid using verbs in URIs. Bad examples that you should avoid:</p>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  https://api.bypress.com/get-accounts    // Bad
  https://api.bypress.com/post-reaction   // Bad
  https://api.bypress.com/remove-reminder // Bad
</code></pre></div>    </div>
  </li>
  <li>
    <p><strong><em>Plural nouns should be used to name collection URIs.</em></strong></p>

    <p>Examples:</p>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  /accounts // Good
  /users    // Good
  /orders   // Good
</code></pre></div>    </div>
  </li>
  <li>
    <p><strong><em>Avoid URIs that include several levels of relationships.</em></strong></p>

    <p>Example:</p>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  /accounts/1/posts/22/comments // Avoid this: this is bad.
</code></pre></div>    </div>

    <p>The example mentioned above is hard to maintain. Instead, follow these steps:</p>

    <ol>
      <li>Get all the posts for account 1.
        <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  /accounts/1/posts
</code></pre></div>        </div>
      </li>
      <li>Then, get all the comments for that post.
        <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  /posts/22/comments
</code></pre></div>        </div>
      </li>
    </ol>
  </li>
  <li>
    <p><strong><em>Avoid creating a large number of APIs that respond with smaller resources.</em></strong></p>

    <p>In other words, have a smaller number of APIs. This small set of APIs should combine related information, create a bigger resource, and then return them via a single request. But be careful not to take it to its extreme, and keep it balanced, as unnecessary fetching will increase latency and bandwidth costs.</p>

    <p>Bad Example:</p>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  /users/1
  /users/1/address
  /users/1/contact
</code></pre></div>    </div>

    <p>Instead of creating 3 different APIs to get basic user information, you should return all these details through a single API:</p>
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  /users/1
</code></pre></div>    </div>
  </li>
  <li>
    <p><strong><em>Implement data pagination and filtering:</em></strong></p>

    <p><strong>Data pagination:</strong></p>
    <ul>
      <li>In RESTful APIs, pagination is a technique of dividing large datasets into smaller chunks.</li>
      <li>
        <p>To achieve this, query parameters like <code class="language-plaintext highlighter-rouge">limit</code> (to specify the number of items to return), and <code class="language-plaintext highlighter-rouge">offset</code> (to specify the starting index) are generally used.</p>

        <p>Example:</p>
        <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  GET /posts?limit=10&amp;offset=5
</code></pre></div>        </div>

        <p>Note: Implement <code class="language-plaintext highlighter-rouge">max-limit</code> to prevent server overload.</p>
      </li>
    </ul>

    <p><strong>Filtering:</strong></p>
    <ul>
      <li>
        <p>Filtering allows clients to request only the data that they are interested in.</p>

        <p>Example:</p>
        <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  GET /posts?status=hidden&amp;edited=true
</code></pre></div>        </div>
      </li>
    </ul>

    <p>These techniques improve performance, and allow clients to retrieve only the subset of data that they need.</p>
  </li>
  <li>
    <p><strong><em>Implement API versioning:</em></strong></p>
    <ul>
      <li>API versioning allows you to update/change your API over time without breaking existing clients.</li>
      <li>
        <p>One of the most common ways to achieve this is through URI versioning: adding <code class="language-plaintext highlighter-rouge">v1, v2, v3, etc</code> to your URI.</p>

        <p>Examples:</p>
        <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  https://api.bypress.com/v1/accounts
  https://api.bypress.com/v2/accounts // Respond with different resources.
  https://api.bypress.com/v3/accounts // Respond with different resources.
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[NOTE: The goal of this blog post is to explain REST API in easy to understand words, like a student’s notes, without diving too deep.]]></summary></entry><entry><title type="html">Go Cheatsheet</title><link href="https://coderparth.github.io/2025/12/25/go-cheatsheet.html" rel="alternate" type="text/html" title="Go Cheatsheet" /><published>2025-12-25T00:00:00+00:00</published><updated>2025-12-25T00:00:00+00:00</updated><id>https://coderparth.github.io/2025/12/25/go-cheatsheet</id><content type="html" xml:base="https://coderparth.github.io/2025/12/25/go-cheatsheet.html"><![CDATA[<p>Below you will find a quick, and short cheatsheet, written with simple examples, and easy to understand words.</p>

<h3 id="declaring-variables-of-different-types">Declaring variables of different types:</h3>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">var</span> <span class="n">i</span> <span class="kt">int</span>
<span class="k">var</span> <span class="n">s</span> <span class="kt">string</span>
<span class="k">var</span> <span class="n">b</span> <span class="kt">byte</span>
<span class="k">var</span> <span class="n">bo</span> <span class="kt">bool</span>         <span class="c">// Boolean: true or false</span>
<span class="k">var</span> <span class="n">ch</span> <span class="kt">rune</span>         <span class="c">// Go's equivalent of a single character.</span>
<span class="k">var</span> <span class="n">sSlice</span> <span class="p">[]</span><span class="kt">string</span> <span class="c">// This creates a slice of strings.</span>
<span class="k">var</span> <span class="n">sArr</span> <span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="kt">string</span>  <span class="c">// This creates an array with a length of 3 strings.</span>
<span class="k">var</span> <span class="n">mp</span> <span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span> <span class="c">// Creates a map with string type as key, and int type as value.</span></code></pre></figure>

<p><strong>Note:</strong> For the map declared above, when doing write operations, Go panics: <code class="language-plaintext highlighter-rouge">panic: assignment to entry in nil map</code>. So an initialization is required before the first write.</p>

<p>Either <code class="language-plaintext highlighter-rouge">mp = map[string]int{}</code> or <code class="language-plaintext highlighter-rouge">mp = make(map[string]int)</code> will work.</p>

<h4 id="constants">Constants</h4>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">const</span> <span class="n">n</span> <span class="o">=</span> <span class="m">20</span> <span class="c">// Go supports untyped constants.</span>
<span class="k">const</span> <span class="n">num</span> <span class="kt">int</span> <span class="o">=</span> <span class="m">5</span>
<span class="k">const</span> <span class="n">str</span> <span class="kt">string</span> <span class="o">=</span> <span class="s">"const"</span>
<span class="k">const</span> <span class="n">st</span> <span class="o">=</span> <span class="s">"this is a string"</span></code></pre></figure>

<h4 id="declarationinitialisations-that-are-only-valid-inside-a-function">Declaration/Initialisations that are only valid inside a function.</h4>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">declare</span><span class="p">()</span> <span class="p">{</span> <span class="c">// All functions start with "func" keyword.</span>
	<span class="n">str</span> <span class="o">:=</span> <span class="s">""</span> <span class="c">// This way of initialization is only valid inside a function.</span>
	<span class="n">num</span> <span class="o">:=</span> <span class="m">3</span>
	<span class="n">isTrue</span> <span class="o">:=</span> <span class="no">true</span>
	<span class="n">c</span> <span class="o">:=</span> <span class="sc">'a'</span>                    <span class="c">// creates a rune</span>
	<span class="n">s</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{}</span>             <span class="c">// creates a slice of string type.</span>
	<span class="n">hashMap</span> <span class="o">:=</span> <span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">{}</span> <span class="c">// Creates a map of string as key, and int as value.</span>
<span class="p">}</span></code></pre></figure>

<p><strong>Note:</strong>  In Golang, all declared variables must be used, else compiler will throw an error.<br />
Example of the error: <code class="language-plaintext highlighter-rouge">declared and not used: str</code></p>

<h3 id="functions">Functions</h3>
<p>In Golang, functions are declared using the <code class="language-plaintext highlighter-rouge">func</code> keyword. Below <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code> are parameters with an <code class="language-plaintext highlighter-rouge">int</code> type.</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">add</span><span class="p">(</span><span class="n">a</span> <span class="kt">int</span><span class="p">,</span> <span class="n">b</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span> <span class="c">// int indicates the type of the return value.</span>
	<span class="c">// function parameters of the same type can also be written like this:</span>
	<span class="c">// func add(a , b int) int {</span>
	<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">nums</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 class="p">{</span> <span class="c">// A way to indicate multiple return values/types.</span>
	<span class="k">return</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span>
<span class="p">}</span></code></pre></figure>

<p><strong>NOTE:</strong> Function names that start with lowercase (example: func add()) act like private methods of a package. And function names that start with an uppercase (example: func Add()) act like public methods, and are automatically exported.</p>

<h3 id="variadic-functions">Variadic functions</h3>
<p>Variadic functions can accept a variable number of arguments.
In Go, three dots(…) followed by a type, is used as a parameter to signify a variadic function.</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">variadic</span><span class="p">(</span><span class="n">nums</span> <span class="o">...</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">sum</span> <span class="o">:=</span> <span class="m">0</span>
	<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">n</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">nums</span> <span class="p">{</span>
		<span class="n">sum</span> <span class="o">+=</span> <span class="n">n</span>
	<span class="p">}</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">sum</span><span class="p">)</span>
<span class="p">}</span>

<span class="n">variadic</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span><span class="p">)</span>
<span class="n">variadic</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">2</span><span class="p">)</span></code></pre></figure>

<h3 id="defer">Defer</h3>
<p>An important concept/keyword to understand when learning functions in golang is the concept of “defer”.
<code class="language-plaintext highlighter-rouge">defer</code> works quite similar to what it means: it puts off an event to a later time.
<code class="language-plaintext highlighter-rouge">defer</code> runs just before the function returns.</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">deferExample</span><span class="p">()</span> <span class="p">{</span>
	<span class="k">defer</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"print this later"</span><span class="p">)</span> <span class="c">// prints this later, when the function is about to return.  </span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"print this now"</span><span class="p">)</span>         <span class="c">// prints this first.</span>
<span class="p">}</span></code></pre></figure>

<h3 id="slice-methods">Slice methods</h3>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">sliceMethods</span><span class="p">()</span> <span class="p">{</span>
 	<span class="n">arr</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">}</span>
 	<span class="n">arr</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="m">5</span><span class="p">)</span> <span class="c">// appending to a slice</span>
 	<span class="n">val</span> <span class="o">:=</span> <span class="n">arr</span><span class="p">[</span><span class="m">0</span><span class="p">]</span>        <span class="c">// getting the value at 0th index</span>
 	<span class="n">arr</span><span class="p">[</span><span class="m">2</span><span class="p">]</span> <span class="o">=</span> <span class="m">4</span>           <span class="c">// setting the value as 4 at 2nd index of the slice.</span>

 	<span class="c">// Create a new slice from a specific range of the original slice.</span>
 	<span class="n">newSlice</span> <span class="o">:=</span> <span class="n">arr</span><span class="p">[</span><span class="m">0</span><span class="o">:</span><span class="m">2</span><span class="p">]</span>    <span class="c">// Here, 0 is start index, 2 is end index. Value at 2nd index is not included.</span>
 	<span class="n">length</span> <span class="o">:=</span> <span class="nb">len</span><span class="p">(</span><span class="n">newSlice</span><span class="p">)</span> <span class="c">// len() gives the length of the slice.</span>
<span class="p">}</span></code></pre></figure>

<h3 id="map-methods">Map methods</h3>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">mapMethods</span><span class="p">()</span> <span class="p">{</span>
 	<span class="n">mp</span> <span class="o">:=</span> <span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">{}</span>
 	<span class="n">mp</span><span class="p">[</span><span class="s">"a"</span><span class="p">]</span> <span class="o">=</span> <span class="m">1</span>               <span class="c">// set a key/value</span>
 	<span class="k">if</span> <span class="n">v</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="n">mp</span><span class="p">[</span><span class="s">"a"</span><span class="p">];</span> <span class="n">ok</span> <span class="p">{</span> <span class="c">// checks if the key exists.</span>
 		<span class="c">// do something with the value.</span>
 	<span class="p">}</span>
 	<span class="nb">delete</span><span class="p">(</span><span class="n">mp</span><span class="p">,</span> <span class="s">"a"</span><span class="p">)</span>   <span class="c">// deletes "a" from the map "mp"</span>
 	<span class="n">clear</span><span class="p">(</span><span class="n">mp</span><span class="p">)</span>         <span class="c">// deletes all entries from the map.</span>
 	<span class="n">length</span> <span class="o">:=</span> <span class="nb">len</span><span class="p">(</span><span class="n">mp</span><span class="p">)</span> <span class="c">// Total number of entries in the map.</span>
<span class="p">}</span></code></pre></figure>

<h3 id="loops">Loops</h3>
<p>In Golang, loops are done using the <code class="language-plaintext highlighter-rouge">for</code> and <code class="language-plaintext highlighter-rouge">range</code> keyword</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">loops</span><span class="p">()</span> <span class="p">{</span>
	<span class="k">for</span> <span class="n">i</span> <span class="o">:=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="m">5</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span> <span class="p">{</span>
		<span class="c">// do something</span>
	<span class="p">}</span>

	<span class="n">n</span> <span class="o">:=</span> <span class="m">5</span>
	<span class="k">for</span> <span class="k">range</span> <span class="n">n</span> <span class="p">{</span> <span class="c">// range lets you loop over things easily.</span>
		<span class="c">// do something</span>
	<span class="p">}</span>

	<span class="c">// An infinite loop, similar to "while" from other languages.</span>
	<span class="k">for</span> <span class="p">{</span>
		<span class="k">if</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="m">5</span> <span class="p">{</span>
			<span class="k">break</span>
		<span class="p">}</span>
	<span class="p">}</span>

	<span class="n">arr</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">}</span>
	<span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">val</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">arr</span> <span class="p">{</span>
		<span class="c">// here idx is an index of the current item in arr.</span>
		<span class="c">// val is the value at that index.</span>
	<span class="p">}</span>

	<span class="n">mp</span> <span class="o">:=</span> <span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span>
		<span class="s">"a"</span><span class="o">:</span> <span class="m">0</span><span class="p">,</span>
		<span class="s">"b"</span><span class="o">:</span> <span class="m">1</span><span class="p">,</span>
	<span class="p">}</span>

	<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">mp</span> <span class="p">{</span>
		<span class="c">// k: key, v: value</span>
	<span class="p">}</span>
<span class="p">}</span></code></pre></figure>

<h3 id="conditionals">Conditionals:</h3>
<h4 id="ifelse-statements">if/else statements</h4>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">conditionals</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">a</span> <span class="o">:=</span> <span class="m">0</span>
	<span class="n">b</span> <span class="o">:=</span> <span class="m">1</span>
	<span class="k">if</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span> <span class="p">{</span>
		<span class="c">// do something</span>
	<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="n">b</span> <span class="o">&gt;</span> <span class="n">a</span> <span class="p">{</span>
		<span class="c">// do something</span>
	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
		<span class="c">// do something</span>
	<span class="p">}</span>
<span class="p">}</span></code></pre></figure>

<h4 id="switchcase">Switch/case</h4>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">cases</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">a</span> <span class="o">:=</span> <span class="m">5</span>
	<span class="k">switch</span> <span class="n">a</span> <span class="p">{</span>
	<span class="k">case</span> <span class="m">6</span><span class="o">:</span>
	<span class="c">// do something if a == 6</span>
	<span class="k">case</span> <span class="m">7</span><span class="o">:</span>
	<span class="c">// do something if a == 7</span>
	<span class="k">default</span><span class="o">:</span>
	<span class="c">// by default do this, if other cases do not match.</span>
	<span class="p">}</span>
<span class="p">}</span></code></pre></figure>

<h3 id="pointers-and-references">Pointers and references</h3>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">pointer</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">num</span> <span class="o">:=</span> <span class="m">4</span>
	<span class="n">p</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">num</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="c">// prints the memory address of num.</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">changeValue</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">num</span> <span class="o">:=</span> <span class="m">4</span>
	<span class="n">passWithoutPointerAndChange</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>               <span class="c">// still prints 4</span>
	<span class="n">passWithPointerAndChange</span><span class="p">(</span><span class="o">&amp;</span><span class="n">num</span><span class="p">)</span> <span class="c">// This changes the value to 5.</span>
	<span class="c">// When passed with the pointer, it modifies the value at that address.</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="c">// now prints 5</span>

	<span class="c">// Same applies to other data types.</span>
	<span class="n">arr</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{}</span>
	<span class="n">tryChangingArrWithoutPointer</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="c">// prints an empty slice [].</span>
	<span class="n">tryChangingArrWithPointer</span><span class="p">(</span><span class="o">&amp;</span><span class="n">arr</span><span class="p">)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span> <span class="c">// prints [3].</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">passWithoutPointerAndChange</span><span class="p">(</span><span class="n">num</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">num</span> <span class="o">=</span> <span class="m">5</span> <span class="c">// change is made to the copy, not the original</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">passWithPointerAndChange</span><span class="p">(</span><span class="n">num</span> <span class="o">*</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
	<span class="c">// * is used infront of num to dereference the pointer.</span>
	<span class="c">// In simple words, go to the memory address stored in num,</span>
	<span class="c">// and give the value that lives there. In this case, 4. </span>
	<span class="o">*</span><span class="n">num</span> <span class="o">=</span> <span class="m">5</span> <span class="c">// modifies the value at that address.</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">tryChangingArrWithoutPointer</span><span class="p">(</span><span class="n">arr</span> <span class="p">[]</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">arr</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="m">3</span><span class="p">)</span> <span class="c">// append is used this way in golang.</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">tryChangingArrWithPointer</span><span class="p">(</span><span class="n">arr</span> <span class="o">*</span><span class="p">[]</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
	<span class="o">*</span><span class="n">arr</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="n">arr</span><span class="p">,</span> <span class="m">3</span><span class="p">)</span> <span class="c">// append is used this way in golang.</span>
<span class="p">}</span></code></pre></figure>

<h3 id="struct">Struct</h3>
<p>Struct, in easy words, is a way to create your own type with multiple fields.</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">type</span> <span class="n">Card</span> <span class="k">struct</span> <span class="p">{</span>
	<span class="n">Name</span>   <span class="kt">string</span>
	<span class="n">Number</span> <span class="kt">string</span>
	<span class="n">CCV</span>    <span class="kt">int</span>
<span class="p">}</span>

<span class="c">// Initialize Card.</span>
<span class="n">c</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">Card</span><span class="p">{}</span>

<span class="c">// This is a way to create a method for a struct in Golang.</span>
<span class="c">// Go does not have classes.</span>
<span class="k">func</span> <span class="p">(</span><span class="n">c</span> <span class="o">*</span><span class="n">Card</span><span class="p">)</span> <span class="n">Add</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">c</span><span class="o">.</span><span class="n">Name</span> <span class="o">=</span> <span class="s">"Rob Kim"</span> <span class="c">// struct fields are accessed using a dot</span>
	<span class="n">c</span><span class="o">.</span><span class="n">Number</span> <span class="o">=</span> <span class="s">"123456890"</span>
	<span class="n">c</span><span class="o">.</span><span class="n">CCV</span> <span class="o">=</span> <span class="m">532</span>
<span class="p">}</span>

<span class="c">// This can be called like this:</span>
<span class="n">c</span><span class="o">.</span><span class="n">Add</span><span class="p">()</span> <span class="c">// Calls Add method on the card created above.</span></code></pre></figure>

<h3 id="interface">Interface</h3>
<p>In simple words, an interface is a contract that says: any type that has these methods automatically satifies this interface type.
In golang, there is no explicit declaration for interfaces.</p>

<p>Below is a simple “Animal” example to showcase interface:</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">type</span> <span class="n">Animal</span> <span class="k">interface</span> <span class="p">{</span>
	<span class="n">Speak</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">type</span> <span class="n">Cat</span> <span class="k">struct</span> <span class="p">{</span>
	<span class="n">Name</span> <span class="kt">string</span>
<span class="p">}</span>

<span class="k">func</span> <span class="p">(</span><span class="n">c</span> <span class="o">*</span><span class="n">Cat</span><span class="p">)</span> <span class="n">Speak</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Meow says %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">Name</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">type</span> <span class="n">Dog</span> <span class="k">struct</span> <span class="p">{</span>
	<span class="n">Name</span> <span class="kt">string</span>
<span class="p">}</span>

<span class="k">func</span> <span class="p">(</span><span class="n">d</span> <span class="o">*</span><span class="n">Dog</span><span class="p">)</span> <span class="n">Speak</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Woof says %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">Name</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">c</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">Cat</span><span class="p">{</span>
		<span class="n">Name</span><span class="o">:</span> <span class="s">"Zing"</span><span class="p">,</span>
	<span class="p">}</span>

	<span class="n">d</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">Dog</span><span class="p">{</span>
		<span class="n">Name</span><span class="o">:</span> <span class="s">"Max"</span><span class="p">,</span>
	<span class="p">}</span>
	<span class="n">animals</span> <span class="o">:=</span> <span class="p">[]</span><span class="n">Animal</span><span class="p">{</span><span class="n">c</span><span class="p">,</span> <span class="n">d</span><span class="p">}</span>   <span class="c">// Here, both Cat and Dog have the same method Speak(), which is a method of the Animal interface.</span>
	<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">a</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">animals</span> <span class="p">{</span> <span class="c">// The types Cat and Dog satisfy the Animal interface type.</span>
		<span class="n">a</span><span class="o">.</span><span class="n">Speak</span><span class="p">()</span>
	<span class="p">}</span>
<span class="p">}</span></code></pre></figure>

<h3 id="generics">Generics</h3>
<p>Generics allows you to write functions or data structures that work with any data type.</p>

<p>Simple example:</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">printSlice</span><span class="p">[</span><span class="n">T</span> <span class="n">any</span><span class="p">](</span><span class="n">s</span> <span class="p">[]</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">s</span> <span class="p">{</span>
		<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="c">// Now you can call this generic function printSlice with any data type. </span>
<span class="n">nums</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">}</span>
<span class="n">printSlice</span><span class="p">(</span><span class="n">nums</span><span class="p">)</span>

<span class="n">s</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"a"</span><span class="p">,</span> <span class="s">"b"</span><span class="p">,</span> <span class="s">"c"</span><span class="p">}</span>
<span class="n">printSlice</span><span class="p">(</span><span class="n">s</span><span class="p">)</span></code></pre></figure>

<h3 id="concurrencygoroutines">Concurrency/Goroutines:</h3>
<p><code class="language-plaintext highlighter-rouge">Goroutines</code> are a way to handle concurrent tasks in Go. It allows multiple tasks to be executed at the same time without blocking each other.</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">add</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">2</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Adding completed"</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">subs</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">2</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Subtracting completed"</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">go</span> <span class="n">add</span><span class="p">()</span>
<span class="k">go</span> <span class="n">subs</span><span class="p">()</span>
<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"I could be doing something else while my goroutines are executing concurrently"</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">3</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span> <span class="c">// This is to not let the main function return immediately. </span></code></pre></figure>

<p><strong>NOTE:</strong> In a real case, if the above code did not have <code class="language-plaintext highlighter-rouge">time.Sleep(3 * time.Second)</code> on the last line, the main function would return immediately after printing the last line, 
instead of waiting for all the goroutines to finish. To deal with this, either channels, or a sync package is generally used in real case scenarios.</p>

<h4 id="channels">Channels</h4>
<p>In easy to understand words, a channel is like a pipe through which multiple goroutines can share data, without worrying about mutex locks, or deadlocks.</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ch</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="kt">int</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span> <span class="c">// Makes a channel of buffer length 2, that can hold data of type int.</span>
	<span class="c">// ch := make(chan int) // You could write this too. This would create a channel without any specific length/size.  </span>
	<span class="k">go</span> <span class="n">add</span><span class="p">(</span><span class="m">5</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="n">ch</span><span class="p">)</span>
	<span class="k">go</span> <span class="n">add</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="n">ch</span><span class="p">)</span>

	<span class="n">res1</span> <span class="o">:=</span> <span class="o">&lt;-</span><span class="n">ch</span> <span class="c">// receive the value from the channel, and assign it to res1. The program waits here, until it receives the value.</span>
	<span class="n">res2</span> <span class="o">:=</span> <span class="o">&lt;-</span><span class="n">ch</span> <span class="c">// receive the value from the channel</span>

	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">res1</span><span class="p">)</span>
	<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">res2</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="kt">int</span><span class="p">,</span> <span class="n">ch</span> <span class="k">chan</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">2</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span>
	<span class="n">ch</span> <span class="o">&lt;-</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="c">// send the value to the channel</span>
<span class="p">}</span></code></pre></figure>

<h3 id="mutex">Mutex</h3>

<p>Mutex is a mutual exclusion lock.</p>

<p>Example use case: Mutex is generally used to update a shared slice across multiple goroutines.</p>

<p>Mutex, and other items from the sync package are generally used together. 
These include: WaitGroup and its methods. 
This is a way in Go to avoid deadlocks, and race conditions.</p>

<p>A simple example is shown below:</p>

<figure class="highlight"><pre><code class="language-go" data-lang="go"><span class="k">import</span> <span class="p">(</span>
	<span class="s">"fmt"</span>
	<span class="s">"sync"</span>
	<span class="s">"time"</span>
<span class="p">)</span>

<span class="k">type</span> <span class="n">Res</span> <span class="k">struct</span> <span class="p">{</span>
	<span class="n">values</span> <span class="p">[]</span><span class="kt">int</span>
	<span class="n">mu</span>     <span class="n">sync</span><span class="o">.</span><span class="n">Mutex</span> <span class="c">// To ensure only one goroutine access this resource at a time.</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">NewRes</span><span class="p">()</span> <span class="o">*</span><span class="n">Res</span> <span class="p">{</span>
	<span class="k">return</span> <span class="o">&amp;</span><span class="n">Res</span><span class="p">{</span>
		<span class="n">values</span><span class="o">:</span> <span class="p">[]</span><span class="kt">int</span><span class="p">{},</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="k">var</span> <span class="n">wg</span> <span class="n">sync</span><span class="o">.</span><span class="n">WaitGroup</span> <span class="c">// A way to wait for all goroutines to finish their tasks.</span>

	<span class="n">r</span> <span class="o">:=</span> <span class="n">NewRes</span><span class="p">()</span>
	<span class="n">wg</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="m">2</span><span class="p">)</span> <span class="c">// Add goroutines to the wait group.</span>
	<span class="k">go</span> <span class="n">add</span><span class="p">(</span><span class="m">5</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">wg</span><span class="p">)</span>
	<span class="k">go</span> <span class="n">add</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">wg</span><span class="p">)</span>
	<span class="n">wg</span><span class="o">.</span><span class="n">Wait</span><span class="p">()</span> <span class="c">// Wait for all the goroutines to finish their tasks.</span>
	<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">v</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">r</span><span class="o">.</span><span class="n">values</span> <span class="p">{</span>
		<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="kt">int</span><span class="p">,</span> <span class="n">r</span> <span class="o">*</span><span class="n">Res</span><span class="p">,</span> <span class="n">wg</span> <span class="o">*</span><span class="n">sync</span><span class="o">.</span><span class="n">WaitGroup</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">defer</span> <span class="n">wg</span><span class="o">.</span><span class="n">Done</span><span class="p">()</span> <span class="c">// Mark this goroutine as done, when this function is about to returns.</span>
	<span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">2</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span>
	<span class="n">sum</span> <span class="o">:=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
	<span class="n">r</span><span class="o">.</span><span class="n">mu</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span> <span class="c">// Lock this resource.</span>
	<span class="n">r</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">values</span><span class="p">,</span> <span class="n">sum</span><span class="p">)</span>
	<span class="n">r</span><span class="o">.</span><span class="n">mu</span><span class="o">.</span><span class="n">Unlock</span><span class="p">()</span> <span class="c">// Unlock this resource.</span>
<span class="p">}</span></code></pre></figure>]]></content><author><name></name></author><summary type="html"><![CDATA[Below you will find a quick, and short cheatsheet, written with simple examples, and easy to understand words.]]></summary></entry><entry><title type="html">Internet Concepts You Should Know as a Developer</title><link href="https://coderparth.github.io/2025/12/23/internet-concepts-you-should-know-as-a-developer.html" rel="alternate" type="text/html" title="Internet Concepts You Should Know as a Developer" /><published>2025-12-23T09:47:01+00:00</published><updated>2025-12-23T09:47:01+00:00</updated><id>https://coderparth.github.io/2025/12/23/internet-concepts-you-should-know-as-a-developer</id><content type="html" xml:base="https://coderparth.github.io/2025/12/23/internet-concepts-you-should-know-as-a-developer.html"><![CDATA[<h2 id="how-does-the-internet-work">How does the internet work?</h2>

<p>The internet is an interconnection of devices and computer systems that are connected through a set of standardized protocols such as IP, and TCP. At the core of the internet, routers are responsible for transferring the data. Data is broken down into smaller chunks called packets, and these packets are first examined by the router, and then transferred from one router to the next, until it arrives at its destination. Routers are responsible for determining the path through which the packets travel.</p>

<p>IP (Internet Protocol) ensures that the packets arrive at the right destination, and TCP (Transmission Control Protocol) ensures that packets are transmitted reliably, and in correct order.</p>

<h2 id="what-is-a-domain-name">What is a domain name?</h2>

<p>A domain name is used to identify a website on the internet. It is a human readable name.</p>

<h2 id="what-is-dns">What is DNS?</h2>

<p>DNS is the Domain Name System responsible for converting a domain name into an IP address.
When you type, let us say, “google.com”, your browser sends a DNS query to a DNS server, which then returns the corresponding IP address, if found. This IP address is used by your browser to create connections with the website/server.</p>

<h2 id="what-is-an-ip-address">What is an IP address?</h2>

<p>An IP address is a unique number used to identify each device on a network, and to route data to the correct destination.</p>

<h2 id="what-is-http">What is HTTP?</h2>

<p>HTTP (Hyper Text Transfer Protocol) is a protocol used to transfer data between a client and a server. Example: from a browser to a website, or vice versa.</p>

<h2 id="what-is-https">What is HTTPS?</h2>

<p>HTTPS (Hyper Text Transfer Protocol Secure) is a protocol used to provide secure communication between a client and a server. It is an encrypted version of HTTP.</p>

<p>Using a SSL/TLS certificate makes a website HTTPS(secure). This provides encryption; all the data between a browser (client) and server is scrambled. Similarly, authentication is provided; the website/server proves that its authenticity, in other words, it is who it is claiming to be.</p>

<p>TLS (Transport Layer Security) is a modern and upgraded version of SSL (Secure Sockets Layer) that fixes many vulnerabilities of SSL.</p>

<h2 id="difference-between-tcp-and-udp">Difference between TCP and UDP:</h2>

<table>
  <thead>
    <tr>
      <th><strong>TCP</strong> (Transmission Control Protocol)</th>
      <th><strong>UDP</strong> (User Datagram Protocol)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>TCP ensures a connection is established with the listener before sending a packet.</td>
      <td>UDP does not establish a connection with the listener before sending a packet.</td>
    </tr>
    <tr>
      <td>Ensures packets arrive in the correct order and retransmits lost packets.</td>
      <td>Does not care if some packets do not arrive in the correct order, or if some packets are lost.</td>
    </tr>
    <tr>
      <td>Example: File transfer</td>
      <td>Example: Live video streaming</td>
    </tr>
  </tbody>
</table>

<h2 id="what-is-a-socket">What is a socket?</h2>

<p>A socket represents a specific endpoint used for communication. This endpoint is achieved by combining IP address and a port number.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Though there are plenty of concepts that have not been covered here, the concepts described above provide an introduction to the fundamentals in short and easy to understand words.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[How does the internet work?]]></summary></entry></feed>