<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dsysd Dev</title>
    <description>The latest articles on Forem by Dsysd Dev (@dsysd_dev).</description>
    <link>https://forem.com/dsysd_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1092124%2F10ec1055-d20a-48da-b2ec-235e16a5469d.jpg</url>
      <title>Forem: Dsysd Dev</title>
      <link>https://forem.com/dsysd_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dsysd_dev"/>
    <language>en</language>
    <item>
      <title>Implementing your own stack in golang</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Wed, 13 Mar 2024 13:56:41 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/implementing-your-own-stack-in-golang-2mkm</link>
      <guid>https://forem.com/dsysd_dev/implementing-your-own-stack-in-golang-2mkm</guid>
      <description>&lt;p&gt;In this post I will be teaching how to implement your own stack data structure in golang from scratch.&lt;/p&gt;

&lt;p&gt;If you would prefer the video format then follow the link below.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=uf24EYeJoaM"&gt;https://www.youtube.com/watch?v=uf24EYeJoaM&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;StackIface&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;Top&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="n"&gt;Pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Top&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// CAUTION! we are not handling those cases where stack is empty&lt;/span&gt;
    &lt;span class="c"&gt;// to be handled by caller&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// handle ?&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="n"&gt;brackets&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[]"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c"&gt;// can add more such pairs if needed&lt;/span&gt;
    &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opening&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bracket&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;brackets&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bracket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bracket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;opening&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bracket&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;opening&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// stack keeps track of opening brackets which need to be popped out&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Top&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  StackIface Interface:
&lt;/h2&gt;

&lt;p&gt;Declares an interface StackIface with four methods: Empty() bool, Top() byte, Pop() bool, and Push(b byte).&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack Type:
&lt;/h2&gt;

&lt;p&gt;Defines a type Stack as a slice of bytes.&lt;br&gt;
The methods of the StackIface interface are implemented for the Stack type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empty() Method:
&lt;/h2&gt;

&lt;p&gt;Checks if the stack is empty.&lt;br&gt;
Returns true if the stack is either nil or has a length of 0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top() Method:
&lt;/h2&gt;

&lt;p&gt;Retrieves the top element of the stack.&lt;br&gt;
Note: The code contains a cautionary comment, indicating that it doesn't handle cases where the stack is empty. This responsibility is left to the caller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pop() Method:
&lt;/h2&gt;

&lt;p&gt;Removes the top element from the stack.&lt;br&gt;
Returns false if the stack is empty; otherwise, it pops the top element.&lt;/p&gt;

&lt;h2&gt;
  
  
  Push() Method:
&lt;/h2&gt;

&lt;p&gt;Adds a byte to the top of the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  isValid() Function:
&lt;/h2&gt;

&lt;p&gt;Takes a string s as input and checks whether the string has valid bracket pairs.&lt;/p&gt;

&lt;p&gt;Initializes brackets with pairs of opening and closing brackets.&lt;/p&gt;

&lt;p&gt;Creates two maps: counter to map closing brackets to their corresponding opening brackets and opening to track opening brackets.&lt;/p&gt;

&lt;p&gt;Initializes an empty Stack to keep track of the opening brackets encountered.&lt;/p&gt;

&lt;p&gt;Iterates through each character in the input string.&lt;/p&gt;

&lt;p&gt;If the character is an opening bracket, it is pushed onto the stack.&lt;/p&gt;

&lt;p&gt;If the character is a closing bracket, it checks if the stack is not empty and if the top of the stack matches the corresponding opening bracket. If so, it pops the opening bracket from the stack. Otherwise, it returns false.&lt;/p&gt;

&lt;p&gt;After iterating through the entire string, it checks if the stack is empty. If so, it means all opening brackets had matching closing brackets, and the function returns true; otherwise, it returns false.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;br&gt;
Instagram: &lt;a href="https://www.instagram.com/dsysd.dev/"&gt;https://www.instagram.com/dsysd.dev/&lt;/a&gt;&lt;br&gt;
Hashnode: &lt;a href="https://dsysd-dev.hashnode.dev/"&gt;https://dsysd-dev.hashnode.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building golang project from scratch - part 3 - setting up the database using docker</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Fri, 29 Dec 2023 10:07:36 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/building-golang-project-from-scratch-part-3-setting-up-the-database-using-docker-b2i</link>
      <guid>https://forem.com/dsysd_dev/building-golang-project-from-scratch-part-3-setting-up-the-database-using-docker-b2i</guid>
      <description>&lt;h2&gt;
  
  
  For those who prefer the video format
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=kww6LL7OWdY"&gt;https://www.youtube.com/watch?v=kww6LL7OWdY&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;Setting up your own postgres database using docker container&lt;br&gt;
Instead of installing the postgres database on your system, you can use docker container to initiate a database for quick tests&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_db_pg_container&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_db&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./migrations/1_db_init.up.sql:/docker-entrypoint-initdb.d/init.sql&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;my_network&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;my_network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your Docker Compose file sets up a PostgreSQL database using the official PostgreSQL Docker image. It also includes a volume mount for initializing the database with an SQL script and uses a custom network. Here’s a breakdown of the key components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Docker Compose Version:&lt;br&gt;
&lt;code&gt;version: ‘3.8’&lt;/code&gt;: Specifies the version of the Docker Compose file syntax.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Services:&lt;br&gt;
— &lt;code&gt;postgres&lt;/code&gt;: Defines a service named “postgres.”&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;image: postgres:latest&lt;/code&gt;: Specifies the PostgreSQL Docker image to use. &lt;code&gt;latest&lt;/code&gt; refers to the latest version of the image.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— &lt;code&gt;container_name: my_db_pg_container&lt;/code&gt;: Assigns a custom name to the PostgreSQL container.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;restart: always&lt;/code&gt;: Configures the container to restart automatically if it stops.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;environment&lt;/code&gt;: Sets environment variables for the PostgreSQL container.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;POSTGRES_DB: my_db&lt;/code&gt;: Specifies the name of the initial database to be created.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;POSTGRES_USER: postgres&lt;/code&gt;: Sets the default user for the PostgreSQL database.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;POSTGRES_PASSWORD: postgres&lt;/code&gt;: Sets the password for the default user.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;ports&lt;/code&gt;: Maps the host machine’s port 5432 to the container’s port 5432, allowing access to the PostgreSQL database.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;volumes&lt;/code&gt;: Mounts the &lt;code&gt;./migrations/1_db_init.up.sql&lt;/code&gt; file into the &lt;code&gt;/docker-entrypoint-initdb.d/init.sql&lt;/code&gt; path inside the container. This file is executed during the initialization of the database.&lt;/p&gt;

&lt;p&gt;— &lt;code&gt;networks&lt;/code&gt;: Connects the service to a custom network named “my_network.”&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Networks:
— &lt;code&gt;my_network&lt;/code&gt;: Defines a custom bridge network named “my_network” to allow communication between containers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This configuration is useful for setting up a PostgreSQL database with a predefined schema or initial data using the SQL script (&lt;code&gt;1_db_init.up.sql&lt;/code&gt;). When the container starts, it will execute the script, initializing the database with the specified settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  To use this Docker Compose file
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Save the file with a &lt;code&gt;.yml&lt;/code&gt; or &lt;code&gt;.yaml&lt;/code&gt; extension (e.g., &lt;code&gt;docker-compose.yml&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Open a terminal in the directory containing the file.&lt;/li&gt;
&lt;li&gt;Run the following command to start the PostgreSQL container:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will download the PostgreSQL image (if not already present) and start the container with the specified configuration. The PostgreSQL server will be accessible on &lt;code&gt;localhost:5432&lt;/code&gt;, and you can connect to it using the provided credentials.&lt;/p&gt;

&lt;p&gt;To stop the container, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    docker-compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adjust the configuration based on your specific requirements and security considerations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article we learnt how we can quickly spin up a database using docker compose&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow me on Medium for regular awesome content and insights.&lt;br&gt;
Subscribe to my Newsletter&lt;/p&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;br&gt;
Instagram: &lt;a href="https://www.instagram.com/dsysd.dev/"&gt;https://www.instagram.com/dsysd.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>database</category>
      <category>go</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building a Golang Project from Scratch — Zero to Hero — Part 2</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Tue, 10 Oct 2023 18:19:22 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/building-a-golang-project-from-scratch-zero-to-hero-part-2-59me</link>
      <guid>https://forem.com/dsysd_dev/building-a-golang-project-from-scratch-zero-to-hero-part-2-59me</guid>
      <description>&lt;p&gt;In this part of the series, we will be designing the whole system which we will be coding in go in the future videos&lt;br&gt;
dsysd dev&lt;/p&gt;
&lt;h2&gt;
  
  
  Youtube Link
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=yiCXjacyOVU"&gt;https://www.youtube.com/watch?v=yiCXjacyOVU&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Brief Explanation
&lt;/h2&gt;

&lt;p&gt;We will have users interact with out system.&lt;/p&gt;

&lt;p&gt;They will be saving their data in the postgres database which is the database we will be using in the backend.&lt;br&gt;
Schema&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Table&lt;/span&gt; &lt;span class="n"&gt;blogs&lt;/span&gt;     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deleted_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;Table&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deleted_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;Table&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;Table&lt;/span&gt; &lt;span class="n"&gt;blog_user&lt;/span&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blog_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;Table&lt;/span&gt; &lt;span class="n"&gt;blog_tag&lt;/span&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blog_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tables &lt;code&gt;blog_user&lt;/code&gt; and &lt;code&gt;blog_tag&lt;/code&gt; will be for keeping the relationships.&lt;/p&gt;

&lt;p&gt;One user can have many blogs and one blog can have many tags&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The user will interact with the system. All data will be saved to postgres database.&lt;/p&gt;

&lt;p&gt;The data will be synced to elasticsearch in the backend. This sync will take place at regular intervals.&lt;/p&gt;

&lt;p&gt;The user will be able to search the data using keywords (which will be fetched from elasticsearch).&lt;/p&gt;

&lt;p&gt;Elasticsearch is a highly available nosql database optimised for searching.&lt;/p&gt;

&lt;p&gt;We cannot fire&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;postgres_table&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="k"&gt;like&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;VALUE&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The query above is super costly especially if have 10s of 1000s of blogs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Follow me on twitter 🐥
&lt;/h2&gt;

&lt;p&gt;Join me on Twitter for a daily dose of knowledge, fascinating trivia, and valuable insights. Let’s embark on a journey of continuous learning and discovery together! Follow me to stay inspired and informed. 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Let’s build our own protocol using tcp and net package in go, part 1</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Sun, 17 Sep 2023 15:05:39 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/lets-build-our-own-protocol-using-tcp-and-net-package-in-go-part-1-3jhj</link>
      <guid>https://forem.com/dsysd_dev/lets-build-our-own-protocol-using-tcp-and-net-package-in-go-part-1-3jhj</guid>
      <description>&lt;p&gt;Building your own protocol using the TCP package in Go involves defining a set of rules for communication between a client and a server.&lt;/p&gt;

&lt;p&gt;These rules determine how data is structured, how messages are framed, and how the client and server interact.&lt;/p&gt;




&lt;p&gt;We are going to build our own custom protocol.&lt;/p&gt;

&lt;p&gt;But before that we must know how to implement a custom net connection in golang where we have a server and clients connect to the server.&lt;/p&gt;

&lt;p&gt;The clients sends messages to the server and we simply print those messages.&lt;/p&gt;

&lt;p&gt;If you prefer the video format with indepth explanation&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=t5u-iHBgEUY"&gt;https://www.youtube.com/watch?v=t5u-iHBgEUY&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Explaining the code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="c"&gt;// Create a TCP listener on localhost:3000&lt;/span&gt;
 &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"couldn't listen to network"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;main&lt;/code&gt; Function: This is the entry point of the program. It does the following.&lt;/p&gt;

&lt;p&gt;It attempts to create a TCP listener on localhost at port 3000 using the &lt;code&gt;net.Listen&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;If an error occurs during this process, it logs an error message and exits the program using &lt;code&gt;log.Fatalln&lt;/code&gt; .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"err while accept"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accepting Connections: Inside an infinite for loop, the code does the following...&lt;/p&gt;

&lt;p&gt;It waits for incoming client connections using &lt;code&gt;l.Accept()&lt;/code&gt; . When a client connection is accepted, it returns a new connection object (conn) and any potential errors.&lt;/p&gt;

&lt;p&gt;If an error occurs during the acceptance of a connection, it logs an error message and continues listening for connections.&lt;/p&gt;

&lt;p&gt;When a connection is successfully accepted, it spawns a new goroutine by calling the handle function with the conn as an argument.&lt;/p&gt;

&lt;p&gt;This allows the server to handle multiple client connections concurrently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="c"&gt;// We keep reading all the messages from the connection&lt;/span&gt;
 &lt;span class="c"&gt;// until the connection is closed.&lt;/span&gt;
 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"connected to: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RemoteAddr&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
 &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="c"&gt;// 1KB buffer to read data&lt;/span&gt;
  &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"err while reading from conn: %v, exiting ..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"message read: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;handle&lt;/code&gt; Function: This function is called for each client connection. It handles the communication with connected clients.&lt;/p&gt;

&lt;p&gt;It prints a message indicating that a connection has been established, including the remote address of the client.&lt;/p&gt;

&lt;p&gt;Inside a loop, it uses a 1KB buffer (buffer) to read data from the client connection using conn.Read().&lt;/p&gt;

&lt;p&gt;If an error occurs while reading data from the client, it logs an error message and returns from the function, effectively closing the connection.&lt;/p&gt;

&lt;p&gt;Otherwise, it prints the received message to the console.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Follow me on twitter 🐥
&lt;/h2&gt;

&lt;p&gt;Join me on Twitter for a daily dose of knowledge, fascinating trivia, and valuable insights.&lt;/p&gt;

&lt;p&gt;Let’s embark on a journey of continuous learning and discovery together! Follow me to stay inspired and informed. 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Dependency Injection like a Pro in Golang</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Wed, 13 Sep 2023 09:20:18 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/dependency-injection-like-a-pro-in-golang-43ao</link>
      <guid>https://forem.com/dsysd_dev/dependency-injection-like-a-pro-in-golang-43ao</guid>
      <description>&lt;p&gt;Are you ever confused about dependency injection ? What if i tell you that it's the simplest topic ever! It's just about passing values to a function !!&lt;/p&gt;

&lt;p&gt;If you prefer the video version&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AJ6uz9mlFOA"&gt;https://www.youtube.com/watch?v=AJ6uz9mlFOA&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dependency Injection is just a fancy way of saying "passing stuff into a function." It's about giving a function or object the things it needs to work.&lt;/p&gt;

&lt;p&gt;It's like baking pizza. You don't bake the pizza at home; you call a pizza place and tell them what you want. The pizza delivery is like a function that takes your order (dependencies) and delivers the result (pizza).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;OrderPizza&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;oven&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;NewOven&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;pizza&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;oven&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BakePizza&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function creates its own dependencies (the oven) instead of having them provided.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;OrderPizza&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oven&lt;/span&gt; &lt;span class="n"&gt;Oven&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pizza&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;oven&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BakePizza&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function is more flexible because you can now choose which oven to use (e.g., regular oven or wood-fired oven).&lt;/p&gt;

&lt;p&gt;Dependency Injection is widely used in Go, especially in building HTTP servers. Explain that you can pass different routers, middleware, and database connections to the server as dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="s"&gt;"fmt"&lt;/span&gt;
 &lt;span class="s"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// Router defines the interface for a router.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// MyRouter is an example implementation of the Router interface.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;MyRouter&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MyRouter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// LoggerMiddleware is an example middleware.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;LoggerMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandlerFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Logging:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="c"&gt;// Create a router instance&lt;/span&gt;
 &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;MyRouter&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

 &lt;span class="c"&gt;// Attach middleware&lt;/span&gt;
 &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LoggerMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

 &lt;span class="c"&gt;// Define routes&lt;/span&gt;
 &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Welcome to our website!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;

 &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/about"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"About Us"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;

 &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/contact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Contact Us"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;

 &lt;span class="c"&gt;// Start the server&lt;/span&gt;
 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server is listening on :8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example:&lt;/p&gt;

&lt;p&gt;We define a Router interface that has a HandleFunc method, which mimics the behavior of Go's http.HandleFunc.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MyRouter&lt;/code&gt; is an implementation of the Router interface.&lt;br&gt;
We create a LoggerMiddleware function, which is a middleware that logs incoming requests.&lt;/p&gt;

&lt;p&gt;In the main function, we create an instance of MyRouter.&lt;br&gt;
We attach the LoggerMiddleware to the router to log requests.&lt;/p&gt;

&lt;p&gt;We define routes using the HandleFunc method provided by our router, which is the equivalent of http.HandleFunc.&lt;br&gt;
Finally, we start the server using http.ListenAndServe.&lt;/p&gt;

&lt;p&gt;This example demonstrates how you can use dependency injection to pass in routers and middleware to create a flexible and modular web server in Go.&lt;/p&gt;

&lt;p&gt;You can easily swap out different routers or middleware components to customize your server's behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Follow me on twitter 🐥
&lt;/h2&gt;

&lt;p&gt;Join me on Twitter for a daily dose of knowledge, fascinating trivia, and valuable insights. Let's embark on a journey of continuous learning and discovery together! Follow me to stay inspired and informed. 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building a Golang Project from Scratch -  Zero to Hero - Part 1</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Tue, 29 Aug 2023 07:06:06 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/building-a-golang-project-from-scratch-zero-to-hero-part-1-45fb</link>
      <guid>https://forem.com/dsysd_dev/building-a-golang-project-from-scratch-zero-to-hero-part-1-45fb</guid>
      <description>&lt;p&gt;In this tutorial series we will be a building a full end to end golang backend project.&lt;/p&gt;

&lt;p&gt;We will be building a full end to end golang backend project. This series will be useful for anyone learning to use golang for their backend development projects.&lt;/p&gt;

&lt;p&gt;So if you are a beginner who is just starting out with golang, backend development or software development in general, follow along.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=rDSOpr3kuWE"&gt;https://www.youtube.com/watch?v=rDSOpr3kuWE&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Watch the video above to understand how you can instantiate a simple golang server using go-chi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Github project
&lt;/h2&gt;

&lt;p&gt;You can follow the github project here&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/dsysd-dev/go-learning-series/tree/main/go-server"&gt;https://github.com/dsysd-dev/go-learning-series/tree/main/go-server&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Follow me on twitter 🐥
&lt;/h2&gt;

&lt;p&gt;Join me on Twitter for a daily dose of knowledge, fascinating trivia, and valuable insights. Let's embark on a journey of continuous learning and discovery together! Follow me to stay inspired and informed. 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>A great use case of golang channels</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Sat, 26 Aug 2023 03:08:17 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/a-great-use-case-of-golang-channels-5fof</link>
      <guid>https://forem.com/dsysd_dev/a-great-use-case-of-golang-channels-5fof</guid>
      <description>&lt;p&gt;In this post we will explore how we can use golang channels for doing a graceful shutdown.&lt;/p&gt;

&lt;p&gt;In the world of web development, managing server shutdowns is a critical aspect that often goes overlooked.&lt;/p&gt;

&lt;p&gt;Abrupt server terminations can lead to data loss, incomplete transactions, and a degraded user experience.&lt;/p&gt;

&lt;p&gt;Fortunately, Go offers a straightforward and elegant solution to this problem through graceful server shutdowns.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore the concept of graceful shutdowns in Go and provide step-by-step guidance on how to implement them in your applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Need for Graceful Shutdowns
&lt;/h2&gt;

&lt;p&gt;When a server is abruptly terminated, active connections and ongoing processes are forcibly interrupted, resulting in potential data corruption and an inconsistent state.&lt;/p&gt;

&lt;p&gt;Graceful shutdowns, on the other hand, allow the server to complete its ongoing operations and connections before exiting, ensuring that no data is lost and users are not disrupted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Graceful Shutdowns in Go
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before we proceed, make sure you have a basic understanding of Go programming.&lt;/p&gt;

&lt;h4&gt;
  
  
  Capturing OS Signals
&lt;/h4&gt;

&lt;p&gt;Go provides the os/signal package to capture OS signals like SIGINT (Ctrl+C) and SIGTERM. These signals indicate the need for a graceful shutdown.&lt;/p&gt;

&lt;h4&gt;
  
  
  Creating a Shutdown Channel
&lt;/h4&gt;

&lt;p&gt;Create a channel that will act as a signal to initiate the shutdown process. This channel will be used to communicate between the main routine and the server's goroutines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;quit&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Listening for Signals
&lt;/h4&gt;

&lt;p&gt;Use the &lt;code&gt;signal.Notify&lt;/code&gt; function to listen for specified signals and send them to the quit channel when received.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementing Shutdown Logic
&lt;/h4&gt;

&lt;p&gt;In your main function or where the server is initialized, implement a select statement that waits for either a signal from the quit channel or a timeout.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received signal: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Perform necessary cleanup and graceful shutdown&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;After&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Timeout reached, shutting down..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Perform necessary cleanup and graceful shutdown&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Putting It All Together
&lt;/h3&gt;

&lt;p&gt;Here's how the full code may look like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"time"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;
    &lt;span class="s"&gt;"os/signal"&lt;/span&gt;
    &lt;span class="s"&gt;"syscall"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="n"&gt;quit&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;syscall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;syscall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGTERM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received signal: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c"&gt;// Perform graceful shutdown logic&lt;/span&gt;
 &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;After&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Timeout reached, shutting down..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c"&gt;// Perform graceful shutdown logic&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server gracefully shut down"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Implementing graceful server shutdowns in your Go applications is a crucial step toward maintaining data integrity, ensuring consistent user experiences, and preventing abrupt disruptions.&lt;/p&gt;

&lt;p&gt;By capturing OS signals and using a well-designed shutdown mechanism, you can handle server terminations in a controlled and graceful manner. &lt;/p&gt;

&lt;p&gt;As you continue to enhance your Go applications, keep the concept of graceful shutdowns in mind to create robust and user-friendly systems.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Format
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_OYGYVMU_oA"&gt;https://www.youtube.com/watch?v=_OYGYVMU_oA&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;if you prefer to watch a live coding video, click on the link above!&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Follow me on twitter 🐥
&lt;/h2&gt;

&lt;p&gt;Join me on Twitter for a daily dose of knowledge, fascinating trivia, and valuable insights. Let's embark on a journey of continuous learning and discovery together! Follow me to stay inspired and informed. 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>coding</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Understand Ownership and borrowing in Rust</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Mon, 21 Aug 2023 06:08:23 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/understand-ownership-and-borrowing-in-rust-5co2</link>
      <guid>https://forem.com/dsysd_dev/understand-ownership-and-borrowing-in-rust-5co2</guid>
      <description>&lt;p&gt;There are many tutorials available on this topic, here I try to show you how I understand this simple but very important concept&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Immutable Borrow&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;borrowed_immutable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Immutable Borrow: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;borrowed_immutable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Mutable Borrow&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;borrowed_mutable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;borrowed_mutable&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mutable Borrow: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;borrowed_mutable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Cannot do an immutable borrow while there's a mutable borrow&lt;/span&gt;
    &lt;span class="c1"&gt;// println!("Immutable Borrow: {}", borrowed_immutable);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main function starts by creating a mutable variable &lt;code&gt;num&lt;/code&gt; with a value of &lt;code&gt;42&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Immutable Borrowing:
&lt;/h3&gt;

&lt;p&gt;An immutable borrow is created with &lt;code&gt;let borrowed_immutable = &amp;amp;num;&lt;/code&gt;. This means we're borrowing num in an immutable way, so we can read its value but not modify it.&lt;/p&gt;

&lt;p&gt;We can have multiple such shared refereces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mutable Borrowing:
&lt;/h3&gt;

&lt;p&gt;A mutable borrow is created with &lt;code&gt;let borrowed_mutable = &amp;amp;mut num;&lt;/code&gt;. This allows us to modify the value of num through the borrowed reference.&lt;/p&gt;

&lt;p&gt;Since it's a mutable borrow, we use the &lt;code&gt;*&lt;/code&gt; operator to dereference the borrowed reference and modify the value. We add &lt;code&gt;10&lt;/code&gt; to it.&lt;/p&gt;

&lt;p&gt;The modified borrowed value is printed with &lt;code&gt;println!&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trying to create an Immutable Borrow again
&lt;/h3&gt;

&lt;p&gt;The code that attempts to create an immutable borrow after a mutable borrow is commented out.&lt;/p&gt;

&lt;p&gt;Rust does not allow an immutable borrow while there's a mutable borrow. This is to prevent potential data races.&lt;/p&gt;

&lt;p&gt;In Rust, mutable and immutable borrows have different rules to ensure memory safety.&lt;/p&gt;

&lt;p&gt;When you have a mutable borrow, no other borrow (mutable or immutable) can be active at the same time.&lt;/p&gt;

&lt;p&gt;This prevents data races where multiple parts of your code try to change data concurrently, which can lead to unpredictable behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Ownership
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;ownership&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// println!("after owner: {}", num);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;ownership&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"owned: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="nf"&gt;.as_ref&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"new num: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  In the main function:
&lt;/h3&gt;

&lt;p&gt;A variable named &lt;code&gt;num&lt;/code&gt; is created and assigned a &lt;code&gt;Box&lt;/code&gt; that contains the value &lt;code&gt;33&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Box&lt;/code&gt; is a smart pointer created on heap that helps manage memory allocation and deallocation.&lt;/p&gt;

&lt;p&gt;The ownership function is called, passing the &lt;code&gt;num&lt;/code&gt; Box to it.&lt;/p&gt;

&lt;p&gt;There's a commented-out line that attempts to print the value of num after it's been passed to the ownership function. &lt;/p&gt;

&lt;p&gt;However, this line is commented out because Rust's ownership system prevents using num after it's been moved to the ownership function.&lt;/p&gt;

&lt;p&gt;The ownership function receives the ownership of the &lt;code&gt;num&lt;/code&gt; Box.&lt;/p&gt;

&lt;p&gt;The value inside the &lt;code&gt;Box&lt;/code&gt; is printed using &lt;code&gt;println!&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The value is then multiplied by &lt;code&gt;2&lt;/code&gt; and assigned to the variable &lt;code&gt;num2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The new value, &lt;code&gt;num2&lt;/code&gt;, is printed using &lt;code&gt;println!&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Key Concept
&lt;/h2&gt;

&lt;p&gt;The key concept here is Rust's ownership system, which ensures memory safety and prevents certain types of bugs like null pointer dereferencing and data races.&lt;/p&gt;

&lt;p&gt;In Rust, when a value is passed into a function (or moved to another variable), the ownership of that value is transferred. &lt;/p&gt;

&lt;p&gt;This means the original variable can't be used afterward, to prevent issues like double freeing memory or using invalid references.&lt;/p&gt;

&lt;p&gt;The Box type is used here to allocate memory on the heap for the &lt;code&gt;i32&lt;/code&gt; value (instead of the stack).&lt;/p&gt;

&lt;p&gt;When the &lt;code&gt;Box&lt;/code&gt; is passed to the ownership function, ownership of the data moves to the function.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This concept is called "moving" in Rust.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the rust default as compared to CPP where values are copied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Format
&lt;/h2&gt;

&lt;p&gt;If you prefer video format, then have a look at this short&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/shorts/AbsYKCEd-XU"&gt;https://www.youtube.com/shorts/AbsYKCEd-XU&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This code demonstrates Rust's strict ownership model and how it helps prevent memory-related bugs.&lt;/p&gt;

&lt;p&gt;It might look a bit complicated at first, but Rust's ownership and borrowing rules play a significant role in ensuring the safety and reliability of your programs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Follow me on twitter 🐥
&lt;/h2&gt;

&lt;p&gt;Join me on Twitter for a daily dose of knowledge, fascinating trivia, and valuable insights. Let's embark on a journey of continuous learning and discovery together! Follow me to stay inspired and informed. 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Reverse a Generic List in golang</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Mon, 21 Aug 2023 05:48:14 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/reverse-a-generic-list-in-golang-2fd4</link>
      <guid>https://forem.com/dsysd_dev/reverse-a-generic-list-in-golang-2fd4</guid>
      <description>&lt;p&gt;In this post we create a simple program to reverse a list, not a specific type of list but a generic list.&lt;br&gt;
Photo by Thomas Bormans on Unsplash&lt;br&gt;
The Reverse Function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a generic function called reverse that takes a slice of any type T as input and returns a reversed slice of the same type T.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;func reverse[T any](list []T)&lt;/code&gt; : &lt;code&gt;[]T&lt;/code&gt; defines the reverse function. The &lt;code&gt;[T any]&lt;/code&gt; syntax indicates that the function is generic and can work with slices of any type.&lt;/p&gt;

&lt;p&gt;Inside the function, a loop is used to reverse the elements of the list. The loop iterates from the beginning (&lt;code&gt;i&lt;/code&gt;) and end (&lt;code&gt;j&lt;/code&gt;) of the slice toward the middle, swapping elements at positions &lt;code&gt;i&lt;/code&gt; and &lt;code&gt;j&lt;/code&gt; until they meet.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;list[i], list[j] = list[j], list[i]&lt;/code&gt; swaps the elements at positions i and j. Pretty neat way to swap elements !!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;i++&lt;/code&gt; increments &lt;code&gt;i&lt;/code&gt;, and &lt;code&gt;j--&lt;/code&gt; decrements &lt;code&gt;j&lt;/code&gt; to move towards the center of the slice.&lt;/p&gt;

&lt;p&gt;Once the loop completes, the function returns the reversed list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Function
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;slice&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;integers&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;initialized&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reverse function is called with the slice l, and the returned result is assigned back to l.&lt;/p&gt;

&lt;p&gt;Finally, &lt;code&gt;fmt.Println(l)&lt;/code&gt; prints the reversed slice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Format
&lt;/h2&gt;

&lt;p&gt;If you prefer video format, then have a look at this short&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/shorts/gt3vRmCG75E"&gt;https://www.youtube.com/shorts/gt3vRmCG75E&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This code demonstrates how to use a generic function to reverse the elements of a slice in Go.&lt;/p&gt;

&lt;p&gt;It’s worth noting that the usage of generics in Go is a feature introduced in Go 1.18 and won’t work with versions before that.&lt;br&gt;
Claps Please!&lt;/p&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Youtube channel
&lt;/h2&gt;

&lt;p&gt;Subscribe to my youtube channel if you are on the lookout for more such awesome content in video format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Follow me on twitter 🐥
&lt;/h2&gt;

&lt;p&gt;Join me on Twitter for a daily dose of knowledge, fascinating trivia, and valuable insights. Let’s embark on a journey of continuous learning and discovery together! Follow me to stay inspired and informed. 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Understanding Lifetime in Rust</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Mon, 31 Jul 2023 11:09:21 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/understanding-lifetime-in-rust-123i</link>
      <guid>https://forem.com/dsysd_dev/understanding-lifetime-in-rust-123i</guid>
      <description>&lt;p&gt;When learning Rust, the first time one encounters a compilation error that states about lifetimes, can be a confusing experience.&lt;/p&gt;

&lt;p&gt;The first thing to understand about lifetimes is that it provides yet another level of security to our program.&lt;/p&gt;

&lt;p&gt;As we all know and probably do, sharing references is a lot better than passing data by copying their values.&lt;/p&gt;

&lt;p&gt;Though, references are easily out of scope when not considered carefully.&lt;/p&gt;

&lt;p&gt;So for instance&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
   &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;     &lt;span class="c1"&gt;// &amp;lt;-- the value owned by x is dropped&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;    &lt;span class="c1"&gt;// &amp;lt;-- r points to a dropped value: ERROR!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The “life” of x‘s value is bound to the code block wrapped by { ... }. Therefore, the “life” of a reference like r pointing to this value, exactly has the same “time of life”.&lt;/p&gt;

&lt;p&gt;All good — and the Rust compiler would complain when detected an situation like the one above.&lt;/p&gt;

&lt;p&gt;Another (C++ -traditional) example is the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;  &lt;span class="c1"&gt;// &amp;lt;-- life of x's owned value ends: ERROR!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also here, the compiler would complain since the returned references points to a dropped value.&lt;/p&gt;

&lt;p&gt;Note that this wouldn't be a problem in case of golang, infact we do this commonly in go&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;uint32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;uint32&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  And we would let garbage collector take care of that.
&lt;/h2&gt;

&lt;p&gt;So far, there was no need for any lifetime parameter because Rust was able to detect all the bad scenarios for us. But let us look at this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;x_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   
&lt;span class="p"&gt;}&lt;/span&gt;     &lt;span class="c1"&gt;// does not compile!&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;// &amp;lt;-- life of x's owned value ends&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In comparison with the previous example, here we kind of try to trick the compiler.&lt;/p&gt;

&lt;p&gt;Instead of a reference, we now try to return a variable that owns its value. But this variable, i.e. the instance of S, wraps a reference to the value owned by x.&lt;/p&gt;

&lt;p&gt;However, this reference after being returned again points to a dropped value.&lt;/p&gt;

&lt;p&gt;Rust, will not complain at the same position as before, but instead does not allow us to declare a struct containing references without lifetime bounds. So it forces us to write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;x_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   
&lt;span class="p"&gt;}&lt;/span&gt;     

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;// &amp;lt;-- life of referrence x_ref is shorter than life of S: ERROR!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler now detects a breach in the use of S, that is, it is tried to have an instance of S containing a reference which lives shorter than the instance itself.&lt;/p&gt;

&lt;p&gt;Note, the instance lives longer since it is returned, whereas the by &lt;code&gt;x_ref&lt;/code&gt; referred value is getting dropped at the end of the function.&lt;/p&gt;

&lt;p&gt;As you can see, lifetime parameters is just a way the compilers ensures its checks do run properly.&lt;/p&gt;

&lt;p&gt;Most of the time, the compiler is telling us automatically where these bounds are required.&lt;/p&gt;

&lt;p&gt;Most important to note, lifetimes do not alter be any means the “life” of a value! Lifetimes are to be considered as additional information of a contract that we do have with the compiler.&lt;/p&gt;

&lt;p&gt;For instance, you could have a function looking like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;'b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'b&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No matter what the function’s body is, this just tells us the following thing:&lt;/p&gt;

&lt;p&gt;The return value of f cannot be used longer than x‘s and z’s life is.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An alternative interpretation is this: The use of f‘s return value, determines how long the passed references x and z must live at least.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The latter interpretation once more underlines that lifetime parameter are additional contract information the compiler from time to time requests from us.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is this all worth the hassle?
&lt;/h2&gt;

&lt;p&gt;Rust’s concept of ownership and rules of borrowing is a lot new material to learn when coming from traditional languages. &lt;/p&gt;

&lt;p&gt;Especially, with regard to the concept of lifetime parameter that introduces yet another layer of syntactical symbols, you might be tempted to ask: “Why not just keep the value until no reference points to it anymore?”&lt;/p&gt;

&lt;p&gt;The answer, as easy it is, as easy can be forgotten: “By this, Rust does not need a garbage collector, nor you have to garbage collect on yourself.”&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>learning</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>String vs str in Rust: Understanding the Fundamental Differences for Efficient Programming</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Mon, 31 Jul 2023 10:58:55 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/string-vs-str-in-rust-understanding-the-fundamental-differences-for-efficient-programming-4og8</link>
      <guid>https://forem.com/dsysd_dev/string-vs-str-in-rust-understanding-the-fundamental-differences-for-efficient-programming-4og8</guid>
      <description>&lt;p&gt;Instead, the string data type in Rust is represented by the "String" type (with an uppercase 'S'). The confusion might arise because of the "str" type (with a lowercase 's'), which is used as a string slice in Rust.&lt;/p&gt;




&lt;h2&gt;
  
  
  String
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;String&lt;/code&gt; type in Rust is a growable, heap-allocated, UTF-8 encoded string.&lt;/p&gt;

&lt;p&gt;It is part of the Rust standard library and is widely used when you need a mutable and dynamic string that can be modified and resized at runtime. &lt;/p&gt;

&lt;p&gt;You can create a new &lt;code&gt;String&lt;/code&gt; by calling its associated function &lt;code&gt;String::new()&lt;/code&gt; or by converting from a string slice using the &lt;code&gt;to_string()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;my_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="nf"&gt;.push_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'R'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'u'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'s'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'t'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: "Hello, Rust"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  str (String Slice)
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;str&lt;/code&gt; type in Rust is a borrowed string slice, also known as a string reference.&lt;/p&gt;

&lt;p&gt;It represents a view into an existing UTF-8 encoded string data. String slices are immutable and have a fixed size that cannot be modified.&lt;/p&gt;

&lt;p&gt;String slices are commonly used to pass string data without transferring ownership, reducing the need for unnecessary memory copies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;print_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, Rust!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;print_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: "Hello, Rust!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Differences between "String" and "str" (String Slice)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ownership:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;String&lt;/code&gt; owns the data it represents and is responsible for its memory allocation and deallocation.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;str&lt;/code&gt; (String Slice) is a borrowed reference to a portion of an existing string or string literal, and it does not own the data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mutability:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;String&lt;/code&gt; is mutable, meaning you can modify its content after creation.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;str&lt;/code&gt; (String Slice) is immutable, and you cannot modify its content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Size:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;String&lt;/code&gt; can dynamically grow or shrink as needed and has a flexible size.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;str&lt;/code&gt; (String Slice) has a fixed size and represents a subset of a larger string data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Allocation:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;String&lt;/code&gt; is heap-allocated, and its memory is managed by the Rust standard library.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;str&lt;/code&gt; (String Slice) does not require any heap allocation and is often used as borrowed references to string literals or other &lt;code&gt;String&lt;/code&gt; types.&lt;/p&gt;

&lt;h2&gt;
  
  
  But what is a view
&lt;/h2&gt;

&lt;p&gt;When we say that a "str" (String Slice) represents a view into an existing UTF-8 encoded string data, it means that the "str" type does not own the actual string data.&lt;/p&gt;

&lt;p&gt;Instead, it provides a read-only reference to a portion of an existing UTF-8 encoded string.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's break it down
&lt;/h3&gt;

&lt;h4&gt;
  
  
  View
&lt;/h4&gt;

&lt;p&gt;A "view" in this context means that the &lt;code&gt;str&lt;/code&gt; type acts as a window or a lens through which you can observe a part of a larger string.&lt;/p&gt;

&lt;p&gt;It allows you to look at and interact with that specific section of the string without actually copying or owning the entire string data.&lt;/p&gt;

&lt;h4&gt;
  
  
  Existing UTF-8 Encoded String Data
&lt;/h4&gt;

&lt;p&gt;The data referred to by a &lt;code&gt;str&lt;/code&gt; must already exist somewhere in memory.&lt;/p&gt;

&lt;p&gt;It could be a string literal (a sequence of characters enclosed in double quotes) or a part of a heap-allocated "String" type.&lt;/p&gt;

&lt;p&gt;In either case, the string data must be UTF-8 encoded, as Rust enforces UTF-8 encoding for all its string types.&lt;/p&gt;

&lt;h3&gt;
  
  
  UTF-8 Encoded
&lt;/h3&gt;

&lt;p&gt;UTF-8 is a character encoding standard that represents characters in a way that ensures compatibility with the ASCII character set while also supporting a vast range of international characters.&lt;/p&gt;

&lt;p&gt;Rust's &lt;code&gt;str&lt;/code&gt; type enforces UTF-8 encoding to guarantee that strings can represent any valid Unicode text.&lt;/p&gt;

&lt;p&gt;Here's an example to illustrate the concept:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, Rust!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// A heap-allocated String&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_slice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// A string slice representing "Hello"&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Original String: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"String Slice: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_slice&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we have a heap-allocated &lt;code&gt;String&lt;/code&gt; called &lt;code&gt;my_string&lt;/code&gt;, containing the text "Hello, Rust!".&lt;/p&gt;

&lt;p&gt;The line &lt;code&gt;let my_slice: &amp;amp;str = &amp;amp;my_string[0..5];&lt;/code&gt; creates a string slice my_slice that borrows a part of my_string, specifically the characters from index 0 to 4 ("Hello").&lt;/p&gt;

&lt;p&gt;The string slice my_slice does not own the data; it simply provides a view into the existing string data held by my_string.&lt;/p&gt;

&lt;p&gt;The use of string slices allows Rust to efficiently work with and manipulate parts of strings without incurring unnecessary memory copies, making it a memory-safe and high-performance language for string handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In summary, "String" is a dynamic and mutable string type that owns its data, while "str" (String Slice) is an immutable reference to a fixed portion of a string and does not own the data.&lt;/p&gt;

&lt;p&gt;Both types are essential in Rust and serve different purposes depending on the use case and requirements of your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is Arc in Rust and how to use it with rust traits ?</title>
      <dc:creator>Dsysd Dev</dc:creator>
      <pubDate>Thu, 27 Jul 2023 07:29:40 +0000</pubDate>
      <link>https://forem.com/dsysd_dev/what-is-arc-in-rust-and-how-to-use-it-with-rust-traits--iak</link>
      <guid>https://forem.com/dsysd_dev/what-is-arc-in-rust-and-how-to-use-it-with-rust-traits--iak</guid>
      <description>&lt;p&gt;Using Arc with traits in Rust is a bit more involved, but I'll do my best to explain it to you step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Arc : What is it ?
&lt;/h2&gt;

&lt;p&gt;Arc stands for "Atomic Reference Counted" and is a type in Rust's standard library &lt;code&gt;(std::sync::Arc)&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;It allows you to share ownership of data between multiple threads, ensuring that the data is deallocated only when the last reference to it is dropped.&lt;/p&gt;

&lt;p&gt;This is useful when you need to pass data between threads or share it across different parts of your code safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Traits
&lt;/h2&gt;

&lt;p&gt;In Rust, traits define behavior that types can implement.&lt;/p&gt;

&lt;p&gt;Think of them as a set of functions that a type must provide to be considered as implementing that trait.&lt;/p&gt;

&lt;p&gt;Traits enable you to write generic code that works with any type that implements the required behavior.&lt;/p&gt;

&lt;p&gt;Now, let's see how we can combine Arc with traits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining the Trait
&lt;/h2&gt;

&lt;p&gt;First, you need to define the trait that describes the behavior you want your types to implement.&lt;/p&gt;

&lt;p&gt;For example, let's create a simple trait called Printable that requires a print function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;Printable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementing the Trait for a Struct
&lt;/h2&gt;

&lt;p&gt;Next, let's create a simple struct and implement the Printable trait for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MyData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Printable&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;MyData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MyData: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using Arc with the Trait
&lt;/h2&gt;

&lt;p&gt;Now, we want to use Arc to share the MyData instance across different parts of our code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create an instance of MyData&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Hello, Arc!"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="c1"&gt;// Create an Arc that holds a reference to the MyData instance&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;arc_my_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;Printable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Clone the Arc so that we have another reference to the same data&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cloned_arc_my_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;arc_my_data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Now we can use both Arc references to the same data&lt;/span&gt;
    &lt;span class="n"&gt;arc_my_data&lt;/span&gt;&lt;span class="nf"&gt;.print&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;cloned_arc_my_data&lt;/span&gt;&lt;span class="nf"&gt;.print&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we create an Arc that holds a reference to the MyData instance.&lt;/p&gt;

&lt;p&gt;We use the Arc::clone function to create additional references to the same data. The print function is called on both Arc references, and it works as expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Arc
&lt;/h2&gt;

&lt;p&gt;You might have noticed that we used Arc instead of Arc.&lt;/p&gt;

&lt;p&gt;This is because Arc needs to know the size of the type it's holding at compile time, and trait objects like dyn Trait have a dynamic size that's not known at compile time.&lt;/p&gt;

&lt;p&gt;To use Arc with traits, we need to use the dyn keyword to indicate that it's a trait object.&lt;/p&gt;

&lt;p&gt;Using Arc with traits allows us to store different types that implement the same trait within the same Arc, enabling more flexibility and composability in our code.&lt;/p&gt;




&lt;p&gt;That's the basic explanation of using Arc with traits in Rust. It provides you with a way to share trait objects across threads while ensuring proper memory management.&lt;/p&gt;




&lt;h2&gt;
  
  
  But What about Data mutation
&lt;/h2&gt;

&lt;p&gt;You cannot directly mutate the data held by an Arc between different threads.&lt;/p&gt;

&lt;p&gt;The whole purpose of Arc is to provide shared ownership of immutable data across multiple threads in a safe manner.&lt;/p&gt;

&lt;p&gt;It enforces the rule that the data inside an Arc cannot be mutated once it's shared.&lt;/p&gt;

&lt;p&gt;When you have an Arc, it allows multiple threads to have read-only access to the data simultaneously, but it does not provide a way for multiple threads to mutate the data concurrently.&lt;/p&gt;

&lt;p&gt;If you need to mutate the data, you should use interior mutability patterns like Mutex or RwLock in combination with Arc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Mutex
&lt;/h2&gt;

&lt;p&gt;If you want to mutate the data in a thread-safe manner, you can wrap the data inside a Mutex.&lt;/p&gt;

&lt;p&gt;The Mutex enforces that only one thread can acquire the lock to the data at a time, ensuring exclusive access during the mutation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MyData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;MyData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;increment_counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.counter&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_data_clone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;my_data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;my_data_clone&lt;/span&gt;&lt;span class="nf"&gt;.increment_counter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="nf"&gt;.join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;my_data&lt;/span&gt;&lt;span class="py"&gt;.counter&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Final Counter Value: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter_value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using RwLock
&lt;/h2&gt;

&lt;p&gt;If you need to allow multiple threads to read the data simultaneously but still need exclusive access for mutation, you can use RwLock (Read-Write Lock).&lt;/p&gt;

&lt;p&gt;The important thing to remember is that when you use Mutex or RwLock with Arc, you need to wrap the data in these types first before placing it inside the Arc.&lt;/p&gt;

&lt;p&gt;This ensures that thread-safe access and mutation are guaranteed.&lt;/p&gt;

&lt;p&gt;If you need to mutate the data held by an Arc from different threads, you should use interior mutability patterns like Mutex or RwLock in conjunction with Arc to achieve thread safety.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claps Please!
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.&lt;/p&gt;

&lt;p&gt;Follow for regular awesome content and insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to my Newsletter
&lt;/h2&gt;

&lt;p&gt;If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Important Links
&lt;/h2&gt;

&lt;p&gt;Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/dsysd_dev"&gt;https://twitter.com/dsysd_dev&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://www.youtube.com/@dsysd-dev"&gt;https://www.youtube.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dsysd-dev"&gt;https://github.com/dsysd-dev&lt;/a&gt;&lt;br&gt;
Medium: &lt;a href="https://medium.com/@dsysd-dev"&gt;https://medium.com/@dsysd-dev&lt;/a&gt;&lt;br&gt;
Email: &lt;a href="mailto:dsysd.mail@gmail.com"&gt;dsysd.mail@gmail.com&lt;/a&gt;&lt;br&gt;
Telegram 📚: &lt;a href="https://t.me/dsysd_dev_channel"&gt;https://t.me/dsysd_dev_channel&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/dsysd-dev/"&gt;https://www.linkedin.com/in/dsysd-dev/&lt;/a&gt;&lt;br&gt;
Newsletter: &lt;a href="https://dsysd.beehiiv.com/subscribe"&gt;https://dsysd.beehiiv.com/subscribe&lt;/a&gt;&lt;br&gt;
Gumroad: &lt;a href="https://dsysd.gumroad.com/"&gt;https://dsysd.gumroad.com/&lt;/a&gt;&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/dsysd_dev/"&gt;https://dev.to/dsysd_dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
