<?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>DEV Community: Shubham Sethi</title>
    <description>The latest articles on DEV Community by Shubham Sethi (@shsethi).</description>
    <link>https://dev.to/shsethi</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%2F410060%2Ff08c5ea6-a213-4eed-b7a0-27ead22cc174.jpeg</url>
      <title>DEV Community: Shubham Sethi</title>
      <link>https://dev.to/shsethi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shsethi"/>
    <language>en</language>
    <item>
      <title>Creating a private cloud with just a USB thumbdrive</title>
      <dc:creator>Shubham Sethi</dc:creator>
      <pubDate>Sun, 03 Mar 2024 08:29:18 +0000</pubDate>
      <link>https://dev.to/shsethi/creating-a-private-cloud-with-just-a-usb-thumbdrive-kjk</link>
      <guid>https://dev.to/shsethi/creating-a-private-cloud-with-just-a-usb-thumbdrive-kjk</guid>
      <description>&lt;p&gt;Ever dreamed of having your own personal cloud, where your files and media are available across all your devices, without breaking the bank? Let me share a game-changing solution that rivals costly alternatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Connecting an old thumbdrive (aka pendrive) to the router
&lt;/h3&gt;

&lt;p&gt;First things first, I plugged my old pendrive into one of the USB ports on my router. The router detects the USB automatically and this sets the stage for transforming my router into a hub of digital storage. You can also connect your hard drive. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Tweak your router's settings
&lt;/h3&gt;

&lt;p&gt;I went into my router's settings using my web browser. Then, I turned on a few things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FTP Server&lt;/strong&gt;: This let my Android phone connect to the router. Then to access the new ftp server I insatalled an app called "FtpCafe" which acts as a ftp client, this allows you to upload files from my phone to the pendrive directly.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal4mpmv92y2mb443wppy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal4mpmv92y2mb443wppy.png" alt="FTP" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Samba Server&lt;/strong&gt;: This made the pendrive show up as a drive on my Mac, so I could get to my files from there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftshqypdny13aq64tk1x4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftshqypdny13aq64tk1x4.png" alt="Samba" width="800" height="461"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;DMS/DLNA&lt;/strong&gt;: This one was for my smart TV. With it on, my TV could find and play media files from my personal cloud.&lt;br&gt;
Step 3: Upload Files with FtpCafe&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro2ezrf5v401smtbkic9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro2ezrf5v401smtbkic9.png" alt="DMS" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the "FtpCafe" app, I could easily upload files from my phone to the pendrive connected to the router.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Accessing media on your phone
&lt;/h3&gt;

&lt;p&gt;I downloaded the VLC media player app on my Android phone. This let's you connect to the smb server or directly to ftp server and you can stream videos and music from  personal cloud whenever you are connected to home wifi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Enjoy media on smart TV
&lt;/h3&gt;

&lt;p&gt;With SMB server on you can also find and play media from  personal cloud without any fuss. I tried this on my lg smart tv and it was seamless.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Manage files from your mac
&lt;/h3&gt;

&lt;p&gt;Lastly, if I needed to organize stuff on my Mac, I just opened Finder and found my router's Samba server listed as a network drive. From there, I could manage my files, upload new ones, and keep my personal cloud organized.&lt;/p&gt;

&lt;p&gt;And just like that, I had created my own personal cloud using nothing more than a router and a pendrive. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Colima - How to use docker without Docker Desktop?</title>
      <dc:creator>Shubham Sethi</dc:creator>
      <pubDate>Sat, 10 Sep 2022 18:05:48 +0000</pubDate>
      <link>https://dev.to/shsethi/what-is-colima-49kk</link>
      <guid>https://dev.to/shsethi/what-is-colima-49kk</guid>
      <description>&lt;p&gt;So you want to start using Docker and as a mac user you head over to &lt;a href="https://docs.docker.com/desktop/install/mac-install/"&gt;Install Docker Desktop on Mac&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Setup seems super simple until you see this&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Docker Desktop is free for small businesses........but it requires a paid subscription for professional use.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now what do you do ? &lt;br&gt;
How to leverage the power of Docker on your macOS without paying a hefty subscription fees.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;&lt;a href="https://github.com/abiosoft/colima"&gt;colima&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using colima is simple&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;colima
brew &lt;span class="nb"&gt;install &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;br&gt;
Now you can go on to use docker without any issues.&lt;/p&gt;




&lt;p&gt;But let's dive deeper .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is colima? Why we needed Docker Desktop at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are containers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A container is a sandboxed process on our machine that is isolated from all other processes on the host machine. That isolation leverages kernel namespaces and cgroups, features that have been in Linux for a long time. Docker packages these capabilities  so that they are easy to use. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So Docker can only be run on Linux OS ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, Docker as technology can only be run on Linux OS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do i use docker on my Mac then ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You use Docker Desktop.&lt;/p&gt;

&lt;p&gt;It does 2 important things&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creates Linux VM on your host OS (Windows / Mac)&lt;/li&gt;
&lt;li&gt;forwards docker-cli commands from the host OS to created Linux VM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thus we are able to run and use docker-cli on Windows/Mac even though these OS's do not support docker images/containers.&lt;/p&gt;

&lt;p&gt;But since Docker Desktop is no longer free, we need alternatives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lima&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lima&lt;/strong&gt; is tool that launches Linux virtual machines with automatic file sharing, port forwarding, and containerd.&lt;br&gt;
&lt;strong&gt;Li&lt;/strong&gt;nux on &lt;strong&gt;Ma&lt;/strong&gt;c&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lima uses &lt;strong&gt;QEMU&lt;/strong&gt; which is type-2 hypervisor, which virtualises the host operating system.&lt;/p&gt;

&lt;p&gt;Hence we can now run linux virtual machine on top of our mac.&lt;/p&gt;

&lt;p&gt;Also it gives use&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filesystem sharing between mac host system and  virtual machine&lt;/li&gt;
&lt;li&gt;Automatic port forwarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lima setup a virtual machine with &lt;em&gt;containerd&lt;/em&gt;  as container runtime on Mac&lt;br&gt;
We can use &lt;em&gt;&lt;a href="https://github.com/containerd/nerdctl"&gt;nerdctl&lt;/a&gt;&lt;/em&gt; which &lt;code&gt;docker&lt;/code&gt; cli replacement to run our containers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colima&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Colima : &lt;strong&gt;Co&lt;/strong&gt;ntainers on &lt;strong&gt;Li&lt;/strong&gt;nux on &lt;strong&gt;Ma&lt;/strong&gt;c.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Colima builds on top of Lima, it configures the Docker CLI and set docker context such that you can use the &lt;code&gt;docker&lt;/code&gt; client on macOS after &lt;code&gt;colima start&lt;/code&gt; with no additional setup.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Was this article useful to you? I’d love to hear your feedback, so don’t hold back. If you are interested in Kafka, Docker, microservices, or event streaming, or just have any questions, follow me on &lt;a href="https://twitter.com/suave_sethi"&gt;Twitter&lt;/a&gt;.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Sources&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/58859039/what-is-the-use-of-docker-desktop"&gt;https://stackoverflow.com/questions/58859039/what-is-the-use-of-docker-desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/install/mac-install/"&gt;https://docs.docker.com/desktop/install/mac-install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thoughtworks.com/en-in/radar/platforms/colima"&gt;https://www.thoughtworks.com/en-in/radar/platforms/colima&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lima-vm/lima"&gt;https://github.com/lima-vm/lima&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>containerapps</category>
      <category>linux</category>
    </item>
    <item>
      <title>Strategy Pattern in Go</title>
      <dc:creator>Shubham Sethi</dc:creator>
      <pubDate>Tue, 06 Sep 2022 06:39:05 +0000</pubDate>
      <link>https://dev.to/shsethi/strategy-pattern-in-go-488a</link>
      <guid>https://dev.to/shsethi/strategy-pattern-in-go-488a</guid>
      <description>&lt;p&gt;Imagine you have to build a program that simulates birds.&lt;/p&gt;

&lt;p&gt;There can be different type of birds with different flying behaviours.&lt;/p&gt;

&lt;p&gt;A parrot that flies low , an eagle that flies high and ostrich which doesn’t fly at all&lt;/p&gt;

&lt;p&gt;We will start with Bird interface.&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="c"&gt;// Interface&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Bird&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;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Display&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;So anything that implements Fly() and Display() is a Bird.&lt;/p&gt;

&lt;p&gt;A parrot&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;Parrot&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="kt"&gt;string&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;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Parrot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Fly&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;"I can fly"&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;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Parrot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Display&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am a Parrot . I have color =%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&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;or an Eagle&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;Eagle&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="kt"&gt;string&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;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Eagle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Fly&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;"I can fly high"&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;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Eagle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Display&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am a Eagle . I have color =%s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&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;As you can see the Fly() is common mechanism for lot of bids, so we can move this into a common construct.&lt;/p&gt;

&lt;p&gt;In Java, we would create an abstract class, which has some common method implemented and later extend the abstract class to implement varying behaviour.&lt;/p&gt;

&lt;p&gt;In Go we can do so be creating a type that partially implements  Fly() method&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="c"&gt;//abstracting out just flying behaviour&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;FlyStrategy&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;doFly&lt;/span&gt; &lt;span class="n"&gt;FlyBehaviour&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;f&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FlyStrategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doFly&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;We extract out how a bird flies as &lt;code&gt;FlyBehaviour&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;type&lt;/span&gt; &lt;span class="n"&gt;FlyBehaviour&lt;/span&gt; &lt;span class="k"&gt;func&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;FlywithWings&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;"I am  flying with my wings"&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;FlyNoWay&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;"I can't fly"&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;FlyHigh&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;"I am  flying high"&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;Now to extend this behaviour in Java we would use &lt;code&gt;extend&lt;/code&gt; but Go doesn't support inheritance in the classical sense; instead, in encourages &lt;em&gt;composition&lt;/em&gt; as a way to extend the functionality of types. Go supports &lt;em&gt;embedding&lt;/em&gt; of structs and interfaces to express a more seamless &lt;em&gt;composition&lt;/em&gt; of types.&lt;/p&gt;

&lt;p&gt;So to extend &lt;code&gt;FlyStrategy&lt;/code&gt; we will simply embed it inside &lt;code&gt;Parrot&lt;/code&gt; type&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="c"&gt;// Implementation of Parrot with FlyStrategy embed&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Parrot&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;FlyStrategy&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;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Parrot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Display&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am a Parrot . I have color = %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;color&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="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;greenParrot&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;

    &lt;span class="n"&gt;greenParrot&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;Parrot&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;"green"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;FlyStrategy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlyStrategy&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;doFly&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FlywithWings&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;greenParrot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;greenParrot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Display&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;Advantage of this pattern is that we can dynamically update flying strategy .&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="c"&gt;// Interface&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Bird&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;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Display&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;//new&lt;/span&gt;
    &lt;span class="n"&gt;UpdateFlyStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flyb&lt;/span&gt; &lt;span class="n"&gt;FlyBehaviour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;....&lt;/span&gt;
&lt;span class="o"&gt;....&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;FlyStrategy&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;doFly&lt;/span&gt; &lt;span class="n"&gt;FlyBehaviour&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;f&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FlyStrategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doFly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;//new&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;f&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FlyStrategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;UpdateFlyStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flyb&lt;/span&gt; &lt;span class="n"&gt;FlyBehaviour&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doFly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flyb&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;....&lt;/span&gt;
&lt;span class="o"&gt;....&lt;/span&gt;

&lt;span class="n"&gt;greenParrot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UpdateFlyStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FlyHigh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;greenParrot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>go</category>
      <category>designpattern</category>
    </item>
  </channel>
</rss>
