<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Yaml on avni.sh</title>
    <link>http://www.avni.sh/tags/yaml/</link>
    <description>Recent content in Yaml on avni.sh</description>
    <image>
      <title>avni.sh</title>
      <url>http://www.avni.sh/cover.webp</url>
      <link>http://www.avni.sh/cover.webp</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 27 Jun 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://www.avni.sh/tags/yaml/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>File Handling in Go</title>
      <link>http://www.avni.sh/posts/go/file-handling-in-go/</link>
      <pubDate>Tue, 27 Jun 2023 00:00:00 +0000</pubDate>
      <guid>http://www.avni.sh/posts/go/file-handling-in-go/</guid>
      <description>The os package in Go provides data structures, functions, and methods for managing files and directories</description>
      <content:encoded><![CDATA[<p>Reading and writing files is one of the most common tasks in programming projects. Using this skill we can store data persistently and decrease the memory consumption of our program.</p>
<h1 id="paths">Paths</h1>
<p>The <code>path/filepath</code> package provides <code>filepath.Join()</code> function to create filesystem paths for files and directories. The same could also be achieved with string concatenation in Go but it won&rsquo;t be interoperable between different operating systems (Linux uses the forward slash (<code>/</code>) for separators in the path whereas Windows uses the backward slash (<code>\</code>)).</p>
<p>Other functions provided by the <code>path/filepath</code> package:</p>
<ul>
<li><code>filepath.Dir()</code>: Returns the directory from the path (excluding filename).</li>
<li><code>filepath.Base()</code>: Returns the filename from the path (excluding parent directories).</li>
<li><code>filepath.Ext()</code>: Returns the extension of the file.</li>
<li><code>filepath.IsAbs()</code>: Returns <code>true</code> if the <code>filepath</code> is an absolute path otherwise <code>false</code>.</li>
<li><code>filepath.Rel()</code>: Returns relative path between its two argument paths.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;path/filepath&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile</span> <span class="o">:=</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Join</span><span class="p">(</span><span class="s">&#34;/app&#34;</span><span class="p">,</span> <span class="s">&#34;file_handling.go&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example File Path:&#34;</span><span class="p">,</span> <span class="nx">exampleFile</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Filename:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Base</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Directory:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Dir</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Extension in Filename:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Ext</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Is exampleFile path absolute?:&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">IsAbs</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">value</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">filepath</span><span class="p">.</span><span class="nf">Rel</span><span class="p">(</span><span class="s">&#34;/tmp&#34;</span><span class="p">,</span> <span class="nx">exampleFile</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Relative path between /tmp and exampleFile will be:&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">				<span class="nx">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example File Path: /app/file_handling.go</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Filename: file_handling.go</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Directory: /app</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Extension in Filename: .go</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Is exampleFile path absolute?: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Relative path between /tmp and exampleFile will be: ../app/file_handling.go</span>
</span></span></code></pre></div><h1 id="defer-keyword"><code>defer</code> Keyword</h1>
<p>When a file is opened by a program its contents are loaded on the system memory. That&rsquo;s why it is crucial to close the file and release the occupied memory. This will also prevent data corruption on the file.</p>
<p>Any statement in Go prefixed with <code>defer</code> keyword will be executed at the end of the parent function. These statements are generally used for cleanup tasks.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">testFunc</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;This will be executed after testFunc() has ended&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;This is the last statement in testFunc()&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;This will be executed after main() has ended&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">testFunc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Last statement in main()&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// This is the last statement in testFunc()</span>
</span></span><span class="line"><span class="cl"><span class="c1">// This will be executed after testFunc() has ended</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Last statement in main()</span>
</span></span><span class="line"><span class="cl"><span class="c1">// This will be executed after main() has ended</span>
</span></span></code></pre></div><p>We can define the functions for closing files &amp; perform other resource cleanup, then call them with <code>defer</code> keyword to ensure they are executed after our program has finished. The statements will be executed in the reverse order of their declaration.</p>
<h1 id="managing-directories">Managing Directories</h1>
<p>The <code>os</code> package in Go provides functions analogous to common Linux/Windows commands used for managing directories.</p>
<ul>
<li><code>os.Mkdir()</code>: Similar to the <code>mkdir</code> Linux command, it creates the directory given the filepath in string and the octal notation of directory permissions (like <code>0755</code>).</li>
<li><code>os.MkdirAll()</code>: Creates the complete hierarchy of directories similar to the <code>mkdir</code> command executed with <code>--parents</code> or <code>-p</code> flag.</li>
<li><code>os.RemoveAll()</code>: Removes directory (including subfolders and files).</li>
<li><code>os.Getwd()</code>: Returns the present working directory similar to the <code>pwd</code> command.</li>
<li><code>os.Chdir()</code>: Changes present working directory. Same as the <code>cd</code> command.</li>
<li><code>os.ReadDir()</code>: <code>ls</code> command in Linux lists the contents of the current directory, <code>os.ReadDir()</code> will do the same for the directory path passed as the argument. A <code>for</code> loop has to be defined on the slice returned by the function to access each file/directory with its name.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">removeDir</span><span class="p">(</span><span class="nx">dirPath</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">RemoveAll</span><span class="p">(</span><span class="nx">dirPath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">dirPath</span><span class="p">,</span> <span class="s">&#34;removed&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">getPWD</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">pwd</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Getwd</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Present Working Directory is:&#34;</span><span class="p">,</span> <span class="nx">pwd</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Creating temp directory&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Mkdir</span><span class="p">(</span><span class="s">&#34;temp&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Creating temp2/temp3/testDir directory hierarchy&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">MkdirAll</span><span class="p">(</span><span class="s">&#34;temp2/temp3/testDir&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Mkdir</span><span class="p">(</span><span class="s">&#34;temp2/temp4&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Mkdir</span><span class="p">(</span><span class="s">&#34;temp2/temp5&#34;</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// This will be executed after the main() function is finished</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nf">removeDir</span><span class="p">(</span><span class="s">&#34;temp&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nf">removeDir</span><span class="p">(</span><span class="s">&#34;temp2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">val</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadDir</span><span class="p">(</span><span class="s">&#34;temp2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Contents of temp2 directory:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">file</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">val</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;\t&#34;</span><span class="p">,</span><span class="nx">file</span><span class="p">.</span><span class="nf">Name</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Print</span><span class="p">(</span><span class="s">&#34;\n&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nf">getPWD</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Moving one level up&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Chdir</span><span class="p">(</span><span class="s">&#34;../&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">getPWD</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Moving back to /app directory&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">os</span><span class="p">.</span><span class="nf">Chdir</span><span class="p">(</span><span class="s">&#34;/app&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nf">getPWD</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Creating temp directory</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Creating temp2/temp3/testDir directory hierarchy</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Contents of temp2 directory:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         temp3   temp4   temp5</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Present Working Directory is: /app</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Moving one level up</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Present Working Directory is: /</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Moving back to /app directory</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Present Working Directory is: /app</span>
</span></span><span class="line"><span class="cl"><span class="c1">// temp2 removed</span>
</span></span><span class="line"><span class="cl"><span class="c1">// temp removed</span>
</span></span></code></pre></div><h1 id="reading-from-a-file">Reading from a File</h1>
<p>The <code>os.ReadFile()</code> function will load the entire content of a file into the system memory. If we want to save memory or read specific portions of a file we can use <code>os.Open()</code> function. It returns an instance of  <code>os.File</code> struct that could be used for navigating the file in read-only mode.</p>
<p>The <code>os.Seek()</code> method will offset all read and write operations to a specific location in an <code>os.File</code> instance. For example <code>exampleFile.Seek(10, 0)</code> will increase the offset by 10 bytes. Hence, all the read and write operations performed on the <code>exampleFile</code> will skip the first 10 bytes. The second argument in <code>os.Seek()</code> signifies the origin relative to the offset i.e.</p>
<ul>
<li><code>exampleFile.Seek(10, 0)</code>: 10 bytes from the start of the file</li>
<li><code>exampleFile.Seek(10, 1)</code>: 10 bytes from the current offset location</li>
<li><code>exampleFile.Seek(10, 2)</code>: 10 bytes from the end of the file</li>
</ul>
<p><code>exampleFile.Seek(0, 0)</code> will reset the offset to 0 (start of the file).</p>
<p>The <code>os.Read()</code> method is used to read the contents of a file in a byte slice. It returns the number of bytes read as a value. In the following example, we will perform read operations on <code>example.txt</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ cat example.txt
</span></span><span class="line"><span class="cl">Hello, World
</span></span><span class="line"><span class="cl"><span class="m">42</span> is the meaning of life, the universe, and everything
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reading the complete example.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;example.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Content from example.txt:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// Converting the byte slice returned by ReadFile to string</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">exampleFile</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile2</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="s">&#34;example.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">exampleFile2</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Offsetting operations 13 bytes from the start</span>
</span></span><span class="line"><span class="cl">	<span class="nx">exampleFile2</span><span class="p">.</span><span class="nf">Seek</span><span class="p">(</span><span class="mi">13</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">byteArr</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="mi">17</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">numBytes</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">exampleFile2</span><span class="p">.</span><span class="nf">Read</span><span class="p">(</span><span class="nx">byteArr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Bytes read from exampleFile2:&#34;</span><span class="p">,</span> <span class="nx">numBytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%v\n&#34;</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">byteArr</span><span class="p">[:</span><span class="nx">numBytes</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reading the complete example.txt</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Content from example.txt:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello, World</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 42 is the meaning of life, the universe, and everything</span>
</span></span><span class="line"><span class="cl"><span class="c1">// </span>
</span></span><span class="line"><span class="cl"><span class="c1">// Bytes read from exampleFile2: 17</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 42 is the meaning</span>
</span></span></code></pre></div><h1 id="writing-to-a-file">Writing to a File</h1>
<p>The <code>os.Create()</code> function will create a file or directory from the string path passed as its argument.</p>
<p>Similar to <code>os.ReadFile()</code>, the <code>os.WriteFile()</code> function will write the contents of a byte slice to the given file. It will also create the file if it doesn&rsquo;t exist. To perform more granular writes we have <code>os.Write()</code> method.</p>
<p>To open a file for read-write operations we have to use <code>os.OpenFile()</code> instead of <code>os.Open()</code>, with <code>os.O_RDWR</code> as its argument. The changes written to the file by the program will not reflect on the system storage until the <code>os.Sync()</code> method is called.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">readFile</span><span class="p">(</span><span class="nx">filepath</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Reading the contents of&#34;</span><span class="p">,</span> <span class="nx">filepath</span><span class="p">,</span> <span class="s">&#34;:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">byteSlice</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="nx">filepath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">byteSlice</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Writing to hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">byteSlice</span> <span class="o">:=</span> <span class="p">[]</span><span class="nb">byte</span><span class="p">(</span><span class="s">&#34;Hello from Go program\n&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">WriteFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">,</span> <span class="nx">byteSlice</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Write successful&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">readFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">helloFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">helloFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Moving offset to the end of file</span>
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">helloFile</span><span class="p">.</span><span class="nf">Seek</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">byteSliceWrite</span> <span class="o">:=</span> <span class="s">&#34;Hey from WriteFile&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">helloFile</span><span class="p">.</span><span class="nf">WriteString</span><span class="p">(</span><span class="nx">byteSliceWrite</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">readFile</span><span class="p">(</span><span class="s">&#34;hello.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Syncing changes between memory and storage</span>
</span></span><span class="line"><span class="cl">	<span class="nx">helloFile</span><span class="p">.</span><span class="nf">Sync</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Writing to hello.txt</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Write successful</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reading the contents of hello.txt :</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from Go program</span>
</span></span><span class="line"><span class="cl"><span class="c1">//</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Reading the contents of hello.txt :</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hello from Go program</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Hey from WriteFile</span>
</span></span></code></pre></div><h1 id="handling-common-filetypes">Handling Common Filetypes</h1>
<p>JSON, YAML, and XML are one of the most common file types for configuration, test results, and other structured data storage.</p>
<h2 id="json">JSON</h2>
<h3 id="encoding-json">Encoding JSON</h3>
<p>Encoding is the process of converting data into a specific format. To encode data into JSON format we have to use the <code>encoding/json</code> package.</p>
<p>The <code>json.Marshal()</code> function returns the JSON encoding for the struct instance passed as its argument. The fields in struct need to have their first character capitalized.</p>
<p>The Marshal-ed JSON could be written to file with the help of <code>os.OpenFile()</code> and <code>os.Write()</code> functions.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">v</span> <span class="o">:=</span> <span class="nx">Vehicle</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">&#34;Nissan GTR&#34;</span><span class="p">,</span> <span class="nx">Color</span><span class="p">:</span> <span class="s">&#34;Grey&#34;</span><span class="p">,</span> <span class="nx">NumWheels</span><span class="p">:</span> <span class="mi">4</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle instance:&#34;</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">jsonData</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">(</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle JSON:\n&#34;</span><span class="p">,</span> <span class="nb">string</span><span class="p">(</span><span class="nx">jsonData</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">file</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;vehicle.json&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_CREATE</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">file</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">file</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="nx">jsonData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">file</span><span class="p">.</span><span class="nf">Sync</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle instance: {Nissan GTR Grey 4}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle JSON:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  {&#34;Name&#34;:&#34;Nissan GTR&#34;,&#34;Color&#34;:&#34;Grey&#34;,&#34;NumWheels&#34;:4}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Bash" data-lang="Bash"><span class="line"><span class="cl">$ cat vehicle.json 
</span></span><span class="line"><span class="cl"><span class="o">{</span><span class="s2">&#34;Name&#34;</span>:<span class="s2">&#34;Nissan GTR&#34;</span>,<span class="s2">&#34;Color&#34;</span>:<span class="s2">&#34;Grey&#34;</span>,<span class="s2">&#34;NumWheels&#34;</span>:4<span class="o">}</span>
</span></span></code></pre></div><h3 id="decoding-json">Decoding JSON</h3>
<p>Decoding is the reverse of encoding, we take data from a specified format and convert it to its original form. The <code>json</code> Go package provides <code>json.Unmarshal()</code> function for decoding JSON into a struct.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;encoding/json&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">v</span> <span class="nx">Vehicle</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">jsonFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;vehicle.json&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">jsonFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="p">=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">jsonFile</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Struct Instance from JSON:&#34;</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Struct Instance from JSON: {Nissan GTR Grey 4}</span>
</span></span></code></pre></div><h2 id="yaml">YAML</h2>
<p>Similar to the <code>json</code> package, <code>gopkg.in/yaml</code> also provides <code>yaml.Marshal()</code> and <code>yaml.Unmarshal()</code> functions for encoding and decoding data into YAML respectively.</p>
<p>Before using the <code>gopkg.in/yaml</code> package we have to install it with the <code>go get</code> command.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go get gopkg.in/yaml.v2
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;gopkg.in/yaml.v2&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">VehicleUses</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">F1SafetyCar</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Vehicle</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Uses</span> <span class="nx">VehicleUses</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Writing an instance of Vehicle to vehicle.yaml</span>
</span></span><span class="line"><span class="cl">	<span class="nx">v</span> <span class="o">:=</span> <span class="nx">Vehicle</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span><span class="p">:</span><span class="s">&#34;Aston Martin Vantage&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">Color</span><span class="p">:</span> <span class="s">&#34;green&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">NumWheels</span><span class="p">:</span><span class="mi">4</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">Uses</span><span class="p">:</span><span class="nx">VehicleUses</span><span class="p">{</span><span class="nx">F1SafetyCar</span><span class="p">:</span> <span class="kc">true</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle Instance:&#34;</span><span class="p">,</span> <span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">yamlData</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">yaml</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">v</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Vehicle in YAML format:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">yamlData</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">yamlFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;vehicle.yaml&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_CREATE</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">yamlFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s">&#34;vehicle.yaml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">yamlFile</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="nx">yamlData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Creating an instance of Vehicle from vehicle.yaml</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">v2</span> <span class="nx">Vehicle</span>
</span></span><span class="line"><span class="cl">	<span class="nx">yamlFile2</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;vehicle.yaml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="p">=</span> <span class="nx">yaml</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">yamlFile2</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">v2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Instance of Vehicle from vehicle.yaml:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">v2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle Instance: {Aston Martin Vantage green 4 {true}}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Vehicle in YAML format:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// name: Aston Martin Vantage</span>
</span></span><span class="line"><span class="cl"><span class="c1">// color: green</span>
</span></span><span class="line"><span class="cl"><span class="c1">// numwheels: 4</span>
</span></span><span class="line"><span class="cl"><span class="c1">// uses:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//   f1safetycar: true</span>
</span></span><span class="line"><span class="cl"><span class="c1">//</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Instance of Vehicle from vehicle.yaml:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// {Aston Martin Vantage green 4 {true}}</span>
</span></span></code></pre></div><h2 id="xml">XML</h2>
<p>The XML format is commonly used to store test results and configuration. The <code>encoding/xml</code> Go package provides <code>xml.Marshal()</code> and <code>xml.Unmarshal()</code> functions.</p>
<p>If we want the data in a prettified format (with indents on each level) then we can use the <code>xml.MarshalIndent()</code> function. <code>MarshalIndent()</code> is also present in <code>json</code> and <code>gopkg.in/yaml</code> packages.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-Go" data-lang="Go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;encoding/xml&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="s">&#34;os&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Student</span> <span class="kd">struct</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl">	<span class="nx">IdNum</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Subjects</span> <span class="p">[]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// Storing an instance of Student in XML format</span>
</span></span><span class="line"><span class="cl">	<span class="nx">student1</span> <span class="o">:=</span> <span class="nx">Student</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">Name</span><span class="p">:</span> <span class="s">&#34;John Doe&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">IdNum</span><span class="p">:</span> <span class="mi">98</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">	<span class="nx">Subjects</span><span class="p">:[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;English&#34;</span><span class="p">,</span> <span class="s">&#34;Maths&#34;</span><span class="p">,</span> <span class="s">&#34;Science&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Example of a Student instance:&#34;</span><span class="p">,</span> <span class="nx">student1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">xmlFile</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">OpenFile</span><span class="p">(</span><span class="s">&#34;student.xml&#34;</span><span class="p">,</span> <span class="nx">os</span><span class="p">.</span><span class="nx">O_CREATE</span><span class="p">|</span><span class="nx">os</span><span class="p">.</span><span class="nx">O_RDWR</span><span class="p">,</span> <span class="mo">0755</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">xmlFile</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">defer</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="s">&#34;student.xml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">xmlData</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">xml</span><span class="p">.</span><span class="nf">MarshalIndent</span><span class="p">(</span><span class="nx">student1</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">,</span> <span class="s">&#34;	&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Student data in XML format:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">xmlData</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">xmlFile</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="nx">xmlData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c1">// Reading an instance of Student from XML File</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">student2</span> <span class="nx">Student</span>
</span></span><span class="line"><span class="cl">	<span class="nx">xmlFile2</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;student.xml&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">err</span><span class="o">!=</span><span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">err</span> <span class="p">=</span> <span class="nx">xml</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">xmlFile2</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">student2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Student from student.xml:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">student2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// Output</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Example of a Student instance: {John Doe 98 [English Maths Science]}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Student data in XML format:</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  &lt;Student&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Name&gt;John Doe&lt;/Name&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;IdNum&gt;98&lt;/IdNum&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Subjects&gt;English&lt;/Subjects&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Subjects&gt;Maths&lt;/Subjects&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//         &lt;Subjects&gt;Science&lt;/Subjects&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">//  &lt;/Student&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Student from student.xml:</span>
</span></span><span class="line"><span class="cl"><span class="c1">// {John Doe 98 [English Maths Science]}</span>
</span></span></code></pre></div><h1 id="resources">Resources</h1>
<p><a href="https://gobyexample.com/" target="_blank">Go by Example</a><br>
<a href="https://go.dev/blog/json" target="_blank">JSON and Go</a><br>
<a href="https://pkg.go.dev/encoding/json" target="_blank">encoding/json</a><br>
<a href="https://github.com/go-yaml/yaml" target="_blank">go-yaml/yaml</a><br>
<a href="https://pkg.go.dev/gopkg.in/yaml.v2" target="_blank">gopkg.in/yaml.v2</a><br>
<a href="https://pkg.go.dev/encoding/xml" target="_blank">encoding/xml</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
