<?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>Tutorial on My Little Blog</title><link>https://www.parkerchenca.com/tags/tutorial/</link><description>Recent content in Tutorial on My Little Blog</description><generator>Hugo</generator><language>en-us</language><copyright>Parker Chen</copyright><lastBuildDate>Thu, 10 Sep 2026 11:24:00 +0000</lastBuildDate><atom:link href="https://www.parkerchenca.com/tags/tutorial/index.xml" rel="self" type="application/rss+xml"/><item><title>Golang in short</title><link>https://www.parkerchenca.com/tech/golang-in-short/</link><pubDate>Thu, 10 Sep 2026 11:24:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/golang-in-short/</guid><description>Quick notes of GO</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
No need for digging a big hole, just use it.</p>
</blockquote>
<h2 id="golang-in-short">Golang in short</h2>
<hr>
<h3 id="go-is">Go is</h3>
<ol>
<li>A modern high-level programming language that resembles C</li>
<li>Open-source, compiled, statically typed, and memory-safe</li>
</ol>
<h3 id="go-has">Go has</h3>
<ol>
<li>Simple yet powerful package management (pulls directly from GitHub)</li>
<li>Built-in concurrency primitives</li>
<li>Garbage collection (GC)</li>
<li>Lightning-fast compilation</li>
<li>Minimal syntax</li>
<li>Cross-platform compilation</li>
</ol>
<h3 id="go-doesnt-have">Go doesn&rsquo;t have</h3>
<ol>
<li>Classes and inheritance</li>
<li>Function overloading</li>
<li>Implicit type conversions</li>
</ol>
<h3 id="i-use-go-to">I use Go to</h3>
<ol>
<li>Say goodbye to Java&rsquo;s verbose syntax</li>
<li>Build web services and microservices</li>
<li>Handle high-concurrency scenarios</li>
</ol>
<h3 id="go-is-perfect-for">Go is perfect for</h3>
<ol>
<li>Web services and RESTful APIs</li>
<li>Microservices architecture</li>
<li>Network programming and distributed systems</li>
</ol>
<h3 id="go-might-not-be-ideal-for">Go might not be ideal for</h3>
<ol>
<li>GUI desktop applications</li>
<li>Kernel development</li>
<li>Machine learning (Python has a stronger ecosystem)</li>
</ol>
<hr>
<h2 id="installing-go">Installing Go</h2>
<ol>
<li>Using OS package managers
<ul>
<li>Linux: <code>apt</code>, <code>yum</code>, <code>snap</code></li>
<li>macOS: <code>brew</code></li>
<li>Windows: <code>choco</code>, <code>scoop</code>, etc.</li>
</ul>
</li>
<li>Download official precompiled binaries
<ul>
<li>Already compiled, ready to use</li>
<li>Set up path and links manually</li>
</ul>
</li>
<li>Verify with <code>go version</code></li>
</ol>
<h3 id="hello-world">Hello World</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// This is a comment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="cm">/* This is
</span></span></span><span class="line"><span class="cl"><span class="cm">   a multiline
</span></span></span><span class="line"><span class="cl"><span class="cm">   comment */</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nx">main</span><span class="w"> </span><span class="c1">// This is the main package</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// No semicolons at line endings</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;fmt&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;math&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w"> </span><span class="c1">// Importing other packages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">myConstant</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c1">// Constants need explicit initialization</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;helloworld&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Package names -&gt; lowercase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Lowercase in package -&gt; myConstant -&gt; package-private</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Capitalized -&gt; Println() -&gt; exported (public)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="types">Types</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kt">bool</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">int</span><span class="w">  </span><span class="kt">int8</span><span class="w">  </span><span class="kt">int16</span><span class="w">  </span><span class="kt">int32</span><span class="w">  </span><span class="kt">int64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">uint</span><span class="w"> </span><span class="kt">uint8</span><span class="w"> </span><span class="kt">uint16</span><span class="w"> </span><span class="kt">uint32</span><span class="w"> </span><span class="kt">uint64</span><span class="w"> </span><span class="kt">uintptr</span><span class="w"> </span><span class="c1">// Has pointers but no pointer arithmetic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">byte</span><span class="w"> </span><span class="c1">// alias for uint8</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">rune</span><span class="w"> </span><span class="c1">// alias for int32</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">     </span><span class="c1">// Represents a Unicode code point</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">     </span><span class="c1">// From ancient Nordic &#34;rune&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">float32</span><span class="w"> </span><span class="kt">float64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kt">complex64</span><span class="w"> </span><span class="kt">complex128</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Zero value for reference types is nil</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Type assertion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">t</span><span class="p">,</span><span class="w"> </span><span class="nx">ok</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">variable</span><span class="p">.(</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="c1">// Returns two values, ok indicates success</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                        </span><span class="c1">// Panics if ok is not captured and type is wrong</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Type conversion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">myInt</span><span class="w"> </span><span class="kt">int32</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">42</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">myAnotherInt</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">int64</span><span class="p">(</span><span class="nx">myInt</span><span class="p">)</span><span class="w"> </span><span class="c1">// Type conversion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                             </span><span class="c1">// No direct conversion between bool and int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                             </span><span class="c1">// Generally, single characters and numbers can convert</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                             </span><span class="c1">// Otherwise, only conversions within same type family</span><span class="w">
</span></span></span></code></pre></div><h3 id="variables-and-functions">Variables and Functions</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">hi</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c1">// Variables outside functions must have explicit types</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">myFunc</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">innerHi</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;hi&#34;</span><span class="w"> </span><span class="c1">// Inside functions, use := for type inference</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">const</span><span class="w"> </span><span class="nx">hiConst</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&#34;hi again&#34;</span><span class="w"> </span><span class="c1">// Constants cannot use :=</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nx">MapFilter</span><span class="p">[</span><span class="nx">T</span><span class="w"> </span><span class="kt">any</span><span class="p">,</span><span class="w"> </span><span class="nx">R</span><span class="w"> </span><span class="nx">comparable</span><span class="p">](</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">slice</span><span class="w"> </span><span class="p">[]</span><span class="nx">T</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">mapper</span><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">T</span><span class="p">)</span><span class="w"> </span><span class="nx">R</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">predicate</span><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">R</span><span class="p">)</span><span class="w"> </span><span class="kt">bool</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">options</span><span class="w"> </span><span class="o">...</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nx">filtered</span><span class="w"> </span><span class="p">[]</span><span class="nx">R</span><span class="p">,</span><span class="w"> </span><span class="nx">count</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="kt">error</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Returns a function</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">options</span><span class="w"> </span><span class="o">...</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nx">filtered</span><span class="w"> </span><span class="p">[]</span><span class="nx">R</span><span class="p">,</span><span class="w"> </span><span class="nx">count</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="kt">error</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// Implementation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// A complete function signature example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Note the second func starts parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// The last func starts return type -&gt; returns a function</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// T is generic, R is constraint, but they&#39;re essentially the same thing</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="p">(</span><span class="nx">x</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// Anonymous function definition</span><span class="w">
</span></span></span></code></pre></div><h3 id="arrays-slices-and-maps">Arrays, Slices, and Maps</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Arrays - fixed length</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">arr</span><span class="w"> </span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="kt">int</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">arr2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[</span><span class="o">...</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">}</span><span class="w"> </span><span class="c1">// Compiler infers length</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Slices - dynamic length</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">slice</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">slice2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span><span class="w">     </span><span class="c1">// Length 5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">slice3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span><span class="w"> </span><span class="c1">// Length 5, capacity 10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Maps</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">m</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="s">&#34;one&#34;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;two&#34;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">m2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">m2</span><span class="p">[</span><span class="s">&#34;key&#34;</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">42</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Check if key exists</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">value</span><span class="p">,</span><span class="w"> </span><span class="nx">exists</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">m</span><span class="p">[</span><span class="s">&#34;key&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">if</span><span class="w"> </span><span class="nx">exists</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="control-flow">Control Flow</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Only for loops exist</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// All parts of for loop are optional</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="p">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Loop body</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Infinite loop</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Equivalent to while(true)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Condition loop</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="p">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">i</span><span class="o">++</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">expression</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// Iterate over iterables</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                                </span><span class="c1">// Similar to Python&#39;s for..in</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                                </span><span class="c1">// Directly provides index and value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                                </span><span class="c1">// No enumerate function needed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                                </span><span class="c1">// Use _, v to ignore index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// if statement</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">if</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="p">&lt;</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Can assign in condition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Condition body</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// switch statement</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">switch</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// x is optional</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">case</span><span class="w"> </span><span class="mi">1</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;one&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">case</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">:</span><span class="w">      </span><span class="c1">// Multiple values</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;two, three or four&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">default</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;other&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Type switch</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">switch</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">x</span><span class="p">.(</span><span class="kd">type</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">case</span><span class="w"> </span><span class="kt">int</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;int: %d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">case</span><span class="w"> </span><span class="kt">string</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;string: %s\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">default</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;unknown type\n&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="defer-and-channels">Defer and Channels</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// defer - deferred execution (stack structure, LIFO)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">defer</span><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">defer</span><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">defer</span><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nb">panic</span><span class="p">(</span><span class="s">&#34;!&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Output order: 3 2 1 panic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// defer provides stack-based deferred execution</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// panic triggers deferred functions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// channel - channels (queue structure, FIFO)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">channelExample</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">myChan</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">(</span><span class="kd">chan</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="c1">// Buffer size 2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">myChan</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="c1">// 10 goes in</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">myChan</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="c1">// then 20 goes in</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">took</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">&lt;-</span><span class="nx">myChan</span><span class="w">      </span><span class="c1">// took is 10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="o">&lt;-</span><span class="nx">myChan</span><span class="p">)</span><span class="w"> </span><span class="c1">// 20</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">blockingChannel</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">ch</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">(</span><span class="kd">chan</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="c1">// Unbuffered channel</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// ch &lt;- 1           // Will block! Need another goroutine to receive</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Correct approach</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">go</span><span class="w"> </span><span class="kd">func</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">ch</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="o">&lt;-</span><span class="nx">ch</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Channels provide a queue-like or pipe-like structure</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// FIFO</span><span class="w">
</span></span></span></code></pre></div><h3 id="pointers">Pointers</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Go has pointers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Useful when referencing large data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Go&#39;s design philosophy is very close to C-family languages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Fun fact: When passing pointers to functions, both C and Go copy the pointer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// All parameters are pass-by-value in both languages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// But C++ has completely different reference passing mechanism</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">var</span><span class="w"> </span><span class="nx">myPtr</span><span class="w"> </span><span class="o">*</span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// var anotherPtr uintptr  // uintptr is integer type, not pointer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">42</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">myPtr</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">i</span><span class="w"> </span><span class="c1">// Take address</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="o">*</span><span class="nx">myPtr</span><span class="p">)</span><span class="w"> </span><span class="c1">// Dereference, outputs 42</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="o">*</span><span class="nx">myPtr</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">43</span><span class="w">         </span><span class="c1">// Modify through pointer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">i</span><span class="p">)</span><span class="w">      </span><span class="c1">// Outputs 43</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// No pointer arithmetic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="format-verbs">Format Verbs</h3>
<table>
	<thead>
			<tr>
					<th>Verb</th>
					<th>Description</th>
					<th>Example</th>
					<th>Output</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>%v (value)</td>
					<td>Default format</td>
					<td>Printf(&quot;%v&quot;, people)</td>
					<td>{zhangsan}</td>
			</tr>
			<tr>
					<td>%+v</td>
					<td>Adds field names for structs</td>
					<td>Printf(&quot;%+v&quot;, people)</td>
					<td>{Name:zhangsan}</td>
			</tr>
			<tr>
					<td>%#v</td>
					<td>Go syntax representation</td>
					<td>Printf(&quot;%#v&quot;, people)</td>
					<td>main.Human{Name:&ldquo;zhangsan&rdquo;}</td>
			</tr>
			<tr>
					<td>%T (type)</td>
					<td>Type in Go syntax</td>
					<td>Printf(&quot;%T&quot;, people)</td>
					<td>main.Human</td>
			</tr>
			<tr>
					<td>%%</td>
					<td>Percent sign</td>
					<td>Printf(&quot;%%&quot;)</td>
					<td>%</td>
			</tr>
			<tr>
					<td>%t (true)</td>
					<td>true or false</td>
					<td>Printf(&quot;%t&quot;, true)</td>
					<td>true</td>
			</tr>
			<tr>
					<td>%b (binary)</td>
					<td>Binary representation</td>
					<td>Printf(&quot;%b&quot;, 5)</td>
					<td>101</td>
			</tr>
			<tr>
					<td>%c (char)</td>
					<td>Unicode character</td>
					<td>Printf(&quot;%c&quot;, 0x4E2D)</td>
					<td>中</td>
			</tr>
			<tr>
					<td>%d (decimal)</td>
					<td>Decimal</td>
					<td>Printf(&quot;%d&quot;, 0x12)</td>
					<td>18</td>
			</tr>
			<tr>
					<td>%o (octal)</td>
					<td>Octal</td>
					<td>Printf(&quot;%o&quot;, 10)</td>
					<td>12</td>
			</tr>
			<tr>
					<td>%q (quote)</td>
					<td>Single-quoted character literal</td>
					<td>Printf(&quot;%q&quot;, 0x4E2D)</td>
					<td>&lsquo;中&rsquo;</td>
			</tr>
			<tr>
					<td>%x</td>
					<td>Hexadecimal, lowercase</td>
					<td>Printf(&quot;%x&quot;, 13)</td>
					<td>d</td>
			</tr>
			<tr>
					<td>%X</td>
					<td>Hexadecimal, uppercase</td>
					<td>Printf(&quot;%X&quot;, 13)</td>
					<td>D</td>
			</tr>
			<tr>
					<td>%U (unicode)</td>
					<td>Unicode format: U+1234</td>
					<td>Printf(&quot;%U&quot;, 0x4E2D)</td>
					<td>U+4E2D</td>
			</tr>
			<tr>
					<td>%b</td>
					<td>Binary exponent scientific notation</td>
					<td>Printf(&quot;%b&quot;, 10.5)</td>
					<td>5835037194198p-49</td>
			</tr>
			<tr>
					<td>%e</td>
					<td>Scientific notation</td>
					<td>Printf(&quot;%e&quot;, 10.2)</td>
					<td>1.020000e+01</td>
			</tr>
			<tr>
					<td>%E</td>
					<td>Scientific notation</td>
					<td>Printf(&quot;%E&quot;, 10.2)</td>
					<td>1.020000E+01</td>
			</tr>
			<tr>
					<td>%f (float)</td>
					<td>Decimal point, no exponent</td>
					<td>Printf(&quot;%f&quot;, 10.2)</td>
					<td>10.200000</td>
			</tr>
			<tr>
					<td>%g</td>
					<td>Compact format (%e or %f)</td>
					<td>Printf(&quot;%g&quot;, 10.20)</td>
					<td>10.2</td>
			</tr>
			<tr>
					<td>%G</td>
					<td>Compact format (%E or %f)</td>
					<td>Printf(&quot;%G&quot;, 10.20)</td>
					<td>10.2</td>
			</tr>
			<tr>
					<td>%s (string)</td>
					<td>String (string or []byte)</td>
					<td>Printf(&quot;%s&quot;, []byte(&ldquo;Go&rdquo;))</td>
					<td>Go</td>
			</tr>
			<tr>
					<td>%q</td>
					<td>Double-quoted string</td>
					<td>Printf(&quot;%q&quot;, &ldquo;Go&rdquo;)</td>
					<td>&ldquo;Go&rdquo;</td>
			</tr>
			<tr>
					<td>%x</td>
					<td>Hex, lowercase, two chars per byte</td>
					<td>Printf(&quot;%x&quot;, &ldquo;golang&rdquo;)</td>
					<td>676f6c616e67</td>
			</tr>
			<tr>
					<td>%X</td>
					<td>Hex, uppercase, two chars per byte</td>
					<td>Printf(&quot;%X&quot;, &ldquo;golang&rdquo;)</td>
					<td>676F6C616E67</td>
			</tr>
			<tr>
					<td>%p (pointer)</td>
					<td>Hexadecimal with 0x prefix</td>
					<td>Printf(&quot;%p&quot;, &amp;people)</td>
					<td>0x4f57f0</td>
			</tr>
			<tr>
					<td>+</td>
					<td>Always print sign; ASCII-only for %+q</td>
					<td>Printf(&quot;%+q&quot;, &ldquo;中文&rdquo;)</td>
					<td>&ldquo;\u4e2d\u6587&rdquo;</td>
			</tr>
			<tr>
					<td>-</td>
					<td>Pad with spaces on right (left-align)</td>
					<td></td>
					<td></td>
			</tr>
			<tr>
					<td>#</td>
					<td>Alternate format: 0 prefix for octal (%#o), 0x for hex (%#x), etc.</td>
					<td>Printf(&quot;%#U&quot;, &lsquo;中&rsquo;)</td>
					<td>U+4E2D &lsquo;中&rsquo;</td>
			</tr>
			<tr>
					<td>&rsquo; '</td>
					<td>Space for elided sign; spaces between bytes for hex</td>
					<td></td>
					<td></td>
			</tr>
			<tr>
					<td>0</td>
					<td>Pad with zeros; moves padding after sign for numbers</td>
					<td></td>
					<td></td>
			</tr>
	</tbody>
</table>
<p>Reference:</p>
<h3 id="string-formatting">String Formatting</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// %[flags][width][.precision]verb</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Width and alignment</span><span class="w">
</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;%5d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">)</span><span class="w">      </span><span class="c1">// &#34;   42&#34; right-aligned, width 5</span><span class="w">
</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;%-5d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;42   &#34; left-aligned, width 5</span><span class="w">
</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;%05d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;00042&#34; zero-padded</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// String alignment</span><span class="w">
</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;|%10s|\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;hello&#34;</span><span class="p">)</span><span class="w">   </span><span class="c1">// &#34;|     hello|&#34; right-aligned</span><span class="w">
</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;|%-10s|\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;hello&#34;</span><span class="p">)</span><span class="w">  </span><span class="c1">// &#34;|hello     |&#34; left-aligned</span><span class="w">
</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;|%10s|\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;你好&#34;</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;|        你好|&#34; handles Chinese</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">pi</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mf">3.14159265359</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Decimal precision</span><span class="w">
</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;%.2f\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">pi</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;3.14&#34; 2 decimal places</span><span class="w">
</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;%.4f\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">pi</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;3.1416&#34; 4 decimal places (rounded)</span><span class="w">
</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;%8.2f\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">pi</span><span class="p">)</span><span class="w">    </span><span class="c1">// &#34;    3.14&#34; width 8, 2 decimals</span><span class="w">
</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;%08.2f\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">pi</span><span class="p">)</span><span class="w">   </span><span class="c1">// &#34;00003.14&#34; zero-padded</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Scientific notation precision</span><span class="w">
</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;%.3e\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">pi</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;3.142e+00&#34;</span><span class="w">
</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;%.3g\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mf">0.00012345</span><span class="p">)</span><span class="w">  </span><span class="c1">// &#34;0.000123&#34; auto format</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// + flag: show sign</span><span class="w">
</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;%+d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">)</span><span class="w">      </span><span class="c1">// &#34;+42&#34;</span><span class="w">
</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;%+f\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mf">3.14</span><span class="p">)</span><span class="w">   </span><span class="c1">// &#34;-3.140000&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// # flag: show base prefix</span><span class="w">
</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;%#x\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">255</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;0xff&#34;</span><span class="w">
</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;%#o\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="p">)</span><span class="w">       </span><span class="c1">// &#34;010&#34;</span><span class="w">
</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;%#b\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span><span class="w">       </span><span class="c1">// &#34;0b101&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Space: add space for positive numbers</span><span class="w">
</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;% d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="mi">42</span><span class="p">)</span><span class="w">      </span><span class="c1">// &#34; 42&#34;</span><span class="w">
</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;% d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">42</span><span class="p">)</span><span class="w">     </span><span class="c1">// &#34;-42&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Making tables</span><span class="w">
</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;%-10s %8.2f %5d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Apple&#34;</span><span class="p">,</span><span class="w"> </span><span class="mf">3.99</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span><span class="w">
</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;%-10s %8.2f %5d\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Banana&#34;</span><span class="p">,</span><span class="w"> </span><span class="mf">12.5</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Output:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Apple          3.99    10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Banana        12.50     5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Dynamic width and precision</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">width</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">precision</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">2</span><span class="w">
</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;%*.*f\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">width</span><span class="p">,</span><span class="w"> </span><span class="nx">precision</span><span class="p">,</span><span class="w"> </span><span class="nx">pi</span><span class="p">)</span><span class="w">  </span><span class="c1">// Width and precision from variables</span><span class="w">
</span></span></span></code></pre></div><h3 id="structs">Structs</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyStruct</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">x</span><span class="w"> </span><span class="kt">int</span><span class="w">  </span><span class="c1">// Private field (package-visible)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Y</span><span class="w"> </span><span class="kt">int</span><span class="w">  </span><span class="c1">// Public field (exported)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// No need for &#34;-&gt;&#34; with struct pointers, Go handles it</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Value receiver method</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">s</span><span class="w"> </span><span class="nx">MyStruct</span><span class="p">)</span><span class="w"> </span><span class="nf">myFunc</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="nx">s</span><span class="p">.</span><span class="nx">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">x</span><span class="p">,</span><span class="w"> </span><span class="nx">s</span><span class="p">.</span><span class="nx">Y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">y</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Pointer receiver method</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">s</span><span class="w"> </span><span class="o">*</span><span class="nx">MyStruct</span><span class="p">)</span><span class="w"> </span><span class="nf">modify</span><span class="p">(</span><span class="nx">x</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">s</span><span class="p">.</span><span class="nx">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">x</span><span class="w">  </span><span class="c1">// Can modify original struct</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Pointer receivers can accept values and pointers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Value receivers can also accept both, Go handles it automatically</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// In a sense, pointer parameters have &#34;broader&#34; acceptance</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Struct tags</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">User</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Name</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="s">`json:&#34;name&#34; xml:&#34;user-name&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Age</span><span class="w">  </span><span class="kt">int</span><span class="w">    </span><span class="s">`json:&#34;age,omitempty&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Pass</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="s">`json:&#34;-&#34;`</span><span class="w"> </span><span class="c1">// Ignore this field</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Reading tags with reflection</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="s">&#34;reflect&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">field</span><span class="p">,</span><span class="w"> </span><span class="nx">_</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">reflect</span><span class="p">.</span><span class="nf">TypeOf</span><span class="p">(</span><span class="nx">User</span><span class="p">{}).</span><span class="nf">FieldByName</span><span class="p">(</span><span class="s">&#34;Name&#34;</span><span class="p">)</span><span class="w">
</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">field</span><span class="p">.</span><span class="nx">Tag</span><span class="p">.</span><span class="nf">Get</span><span class="p">(</span><span class="s">&#34;json&#34;</span><span class="p">))</span><span class="w">  </span><span class="c1">// &#34;name&#34;</span><span class="w">
</span></span></span></code></pre></div><h3 id="interfaces">Interfaces</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Interfaces define method signatures</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// No explicit implementation needed - types automatically implement interfaces</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Interfaces can embed other interfaces</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyInterface</span><span class="w"> </span><span class="kd">interface</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nf">myAdd</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyStruct</span><span class="w"> </span><span class="kd">struct</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">x</span><span class="w"> </span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">y</span><span class="w"> </span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">s</span><span class="w"> </span><span class="nx">MyStruct</span><span class="p">)</span><span class="w"> </span><span class="nf">myAdd</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Implements myAdd</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">y</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Now MyStruct implements MyInterface</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Empty interface</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">interface</span><span class="p">{}</span><span class="w"> </span><span class="c1">// or any (Go 1.18+)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Can store any type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="kd">interface</span><span class="p">{}</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">42</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&#34;hello&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Empty struct</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">y</span><span class="w"> </span><span class="kd">struct</span><span class="p">{}</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kd">struct</span><span class="p">{}{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Takes no memory, often used as signal</span><span class="w">
</span></span></span></code></pre></div><h3 id="error-handling">Error Handling</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// error is a built-in interface</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="kt">error</span><span class="w"> </span><span class="kd">interface</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nf">Error</span><span class="p">()</span><span class="w"> </span><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Functions typically return result and error</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">result</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nf">doSomething</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;couldn&#39;t convert number: %v\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Custom error</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyError</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">msg</span><span class="w"> </span><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">e</span><span class="w"> </span><span class="nx">MyError</span><span class="p">)</span><span class="w"> </span><span class="nf">Error</span><span class="p">()</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="nx">e</span><span class="p">.</span><span class="nx">msg</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Create errors with errors package</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="s">&#34;errors&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">errors</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;something went wrong&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Format errors with fmt.Errorf</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">&#34;invalid value: %d&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">value</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div><h3 id="concurrency">Concurrency</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Use go keyword to start goroutines</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">go</span><span class="w"> </span><span class="nf">say</span><span class="p">(</span><span class="s">&#34;world&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nf">say</span><span class="p">(</span><span class="s">&#34;hello&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Need to wait for goroutines to finish</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// See Defer and Channels section for channel creation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Sending to full channel blocks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Receiving from empty channel blocks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Close channel</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nb">close</span><span class="p">(</span><span class="nx">myChan</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Note: Only senders should close channels</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Use select to handle multiple channels</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Like concurrent switch</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// select blocks until one case can proceed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// When multiple cases ready, randomly picks one</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">select</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">case</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">&lt;-</span><span class="nx">ch1</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;received from ch1:&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">case</span><span class="w"> </span><span class="nx">ch2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nx">x</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;sent to ch2&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">case</span><span class="w"> </span><span class="o">&lt;-</span><span class="nx">quit</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;quit&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">default</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;no communication&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Mutex</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="s">&#34;sync&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">mu</span><span class="w"> </span><span class="nx">sync</span><span class="p">.</span><span class="nx">Mutex</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">mu</span><span class="p">.</span><span class="nf">Lock</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Critical section</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">mu</span><span class="p">.</span><span class="nf">Unlock</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Use defer to ensure unlock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">mu</span><span class="p">.</span><span class="nf">Lock</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">defer</span><span class="w"> </span><span class="nx">mu</span><span class="p">.</span><span class="nf">Unlock</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Critical section</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Directional channels</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">send</span><span class="p">(</span><span class="nx">ch</span><span class="w"> </span><span class="kd">chan</span><span class="o">&lt;-</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">ch</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="mi">42</span><span class="w"> </span><span class="p">}</span><span class="w">      </span><span class="c1">// Send-only</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">recv</span><span class="p">(</span><span class="nx">ch</span><span class="w"> </span><span class="o">&lt;-</span><span class="kd">chan</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">val</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">&lt;-</span><span class="nx">ch</span><span class="w"> </span><span class="p">}</span><span class="w">   </span><span class="c1">// Receive-only</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Check if channel is closed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">v</span><span class="p">,</span><span class="w"> </span><span class="nx">ok</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">&lt;-</span><span class="nx">ch</span><span class="w">  </span><span class="c1">// ok is false if channel closed and empty</span><span class="w">
</span></span></span></code></pre></div><h3 id="various-magic-">Various Magic 🪄</h3>
<h4 id="heading"><code>...</code></h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// 1. Variadic functions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="nx">nums</span><span class="w"> </span><span class="o">...</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">total</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">nums</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">total</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nx">n</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="nx">total</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Calling</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nf">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w">      </span><span class="c1">// Can pass multiple</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nf">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w">            </span><span class="c1">// Can pass one</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nf">sum</span><span class="p">()</span><span class="w">             </span><span class="c1">// Can pass none</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// 2. Expanding slices</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">numbers</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">result</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="nx">numbers</span><span class="o">...</span><span class="p">)</span><span class="w">  </span><span class="c1">// Expand to multiple arguments</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Common usage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">slice1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">slice2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">combined</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="nx">slice1</span><span class="p">,</span><span class="w"> </span><span class="nx">slice2</span><span class="o">...</span><span class="p">)</span><span class="w">  </span><span class="c1">// Expand slice2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// 3. Array literals</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">arr</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[</span><span class="o">...</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">}</span><span class="w">  </span><span class="c1">// Compiler calculates length, result is [5]int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Useful with indices</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">arr</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[</span><span class="o">...</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;zero&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="mi">5</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;five&#34;</span><span class="p">,</span><span class="w">   </span><span class="c1">// Array length is 6</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>Notes:</p>
<ol>
<li>Variadic parameter must be last</li>
<li>Inside function, variadic parameter is slice type</li>
<li>Types must match when expanding</li>
</ol>
<h4 id="initialization-tricks">Initialization Tricks</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Initialize array with indices</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">arr</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[</span><span class="mi">10</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="mi">0</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">}</span><span class="w">  </span><span class="c1">// 0th is 1, 9th is 10, rest are 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Initialize map with keys</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;a&#34;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="s">&#34;b&#34;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Partial struct initialization</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">Point</span><span class="w"> </span><span class="kd">struct</span><span class="p">{</span><span class="w"> </span><span class="nx">X</span><span class="p">,</span><span class="w"> </span><span class="nx">Y</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">Point</span><span class="p">{</span><span class="nx">Y</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">}</span><span class="w">  </span><span class="c1">// X is 0, Y is 10</span><span class="w">
</span></span></span></code></pre></div><h4 id="iota-enumerations">iota Enumerations</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// iota starts at 0 in each const declaration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">A</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kc">iota</span><span class="w">  </span><span class="c1">// 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">B</span><span class="w">         </span><span class="c1">// 1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">C</span><span class="w">         </span><span class="c1">// 2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Skip values</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">_</span><span class="w">  </span><span class="p">=</span><span class="w"> </span><span class="kc">iota</span><span class="w">  </span><span class="c1">// 0 (skip)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">KB</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="p">(</span><span class="mi">10</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="kc">iota</span><span class="p">)</span><span class="w">  </span><span class="c1">// 1 &lt;&lt; 10 = 1024</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">MB</span><span class="w">         </span><span class="c1">// 1 &lt;&lt; 20 = 1048576</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">GB</span><span class="w">         </span><span class="c1">// 1 &lt;&lt; 30 = 1073741824</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Bit flag enums</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">Permission</span><span class="w"> </span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Read</span><span class="w"> </span><span class="nx">Permission</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="kc">iota</span><span class="w">  </span><span class="c1">// 1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Write</span><span class="w">                        </span><span class="c1">// 2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Execute</span><span class="w">                      </span><span class="c1">// 4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Usage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">perm</span><span class="w"> </span><span class="nx">Permission</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">Read</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nx">Write</span><span class="w">  </span><span class="c1">// Combine permissions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Check permission</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">if</span><span class="w"> </span><span class="nx">perm</span><span class="o">&amp;</span><span class="nx">Read</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Has read permission&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Add permission</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">perm</span><span class="w"> </span><span class="o">|=</span><span class="w"> </span><span class="nx">Execute</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Remove permission</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">perm</span><span class="w"> </span><span class="o">&amp;^=</span><span class="w"> </span><span class="nx">Write</span><span class="w">
</span></span></span></code></pre></div><h4 id="type-aliases-vs-type-definitions">Type Aliases vs Type Definitions</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Type alias (Go 1.9+) - completely equivalent</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyInt</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kt">int</span><span class="w">  </span><span class="c1">// MyInt is int, interchangeable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Type definition - creates new type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyInt</span><span class="w"> </span><span class="kt">int</span><span class="w">    </span><span class="c1">// MyInt is new type, cannot assign directly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">Celsius</span><span class="w"> </span><span class="kt">float64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">Fahrenheit</span><span class="w"> </span><span class="kt">float64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">c</span><span class="w"> </span><span class="nx">Celsius</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">f</span><span class="w"> </span><span class="nx">Fahrenheit</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">212</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// f = c  // Error! Type mismatch</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">f</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nf">Fahrenheit</span><span class="p">(</span><span class="nx">c</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">9</span><span class="o">/</span><span class="mi">5</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">32</span><span class="p">)</span><span class="w">  </span><span class="c1">// Need explicit conversion</span><span class="w">
</span></span></span></code></pre></div><h4 id="make-vs-new">make vs new</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nb">new</span><span class="p">(</span><span class="nx">T</span><span class="p">)</span><span class="w">      </span><span class="c1">// Returns *T, zero value allocation; commonly for simple structs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nb">make</span><span class="p">(</span><span class="o">...</span><span class="p">)</span><span class="w">   </span><span class="c1">// Only for slice/map/chan, returns initialized value (not pointer)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Examples</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">new</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="w">           </span><span class="c1">// *int, value is 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span><span class="w">     </span><span class="c1">// []int, length 5, initialized</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="c1">// map[string]int, initialized</span><span class="w">
</span></span></span></code></pre></div><h3 id="go-gotchas-and-important-notes">Go Gotchas and Important Notes</h3>
<h4 id="slice-underlying-array-sharing">Slice Underlying Array Sharing</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Passing slice copies slice header (pointer, len, cap), shares underlying array</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">s</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span><span class="w">         </span><span class="c1">// Shares underlying array with s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="nx">s</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span><span class="w">   </span><span class="c1">// May trigger reallocation, t no longer shares</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Modifying shared underlying array</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">5</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">s</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span><span class="w">  </span><span class="c1">// [2, 3]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">99</span><span class="w">    </span><span class="c1">// s becomes [1, 99, 3, 4, 5]</span><span class="w">
</span></span></span></code></pre></div><h4 id="map-randomness">Map Randomness</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Map iteration order is random, don&#39;t rely on order</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">int</span><span class="p">{</span><span class="s">&#34;a&#34;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;b&#34;</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;c&#34;</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="nx">k</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">m</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">k</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="p">)</span><span class="w">  </span><span class="c1">// Order may differ each run</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Cannot take address of map elements</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// &amp;m[&#34;key&#34;]  // Compile error: map values not addressable</span><span class="w">
</span></span></span></code></pre></div><h4 id="string-bytes-vs-characters">String Bytes vs Characters</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// len(string) returns byte count, not character count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;你好&#34;</span><span class="w">
</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">len</span><span class="p">(</span><span class="nx">s</span><span class="p">))</span><span class="w">  </span><span class="c1">// 6 (3 bytes per Chinese character)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// for range string iterates by rune (UTF-8 decoded)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">r</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="s">&#34;你好&#34;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;%d: %c\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">r</span><span class="p">)</span><span class="w">  </span><span class="c1">// 0: 你, 3: 好</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// s[i] gives byte</span><span class="w">
</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;%x\n&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;你&#34;</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="w">  </span><span class="c1">// e4 (first byte)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Strings are immutable, convert to []byte or []rune to modify</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;hello&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// s[0] = &#39;H&#39;  // Error!</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">bs</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[]</span><span class="nb">byte</span><span class="p">(</span><span class="nx">s</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">bs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="sc">&#39;H&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">s</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nb">string</span><span class="p">(</span><span class="nx">bs</span><span class="p">)</span><span class="w">  </span><span class="c1">// &#34;Hello&#34;</span><span class="w">
</span></span></span></code></pre></div><h4 id="interface-nil-pitfall">Interface nil Pitfall</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Interface value is (type, data) pair</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// When type != nil, even if data == nil, interface is not nil</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">MyErr</span><span class="w"> </span><span class="kd">struct</span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">e</span><span class="w"> </span><span class="o">*</span><span class="nx">MyErr</span><span class="p">)</span><span class="w"> </span><span class="nf">Error</span><span class="p">()</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">&#34;error&#34;</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">e</span><span class="w"> </span><span class="kt">error</span><span class="w">
</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">e</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">nil</span><span class="p">)</span><span class="w">  </span><span class="c1">// true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">pe</span><span class="w"> </span><span class="o">*</span><span class="nx">MyErr</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="kc">nil</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">e</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">pe</span><span class="w">
</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">e</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">nil</span><span class="p">)</span><span class="w">  </span><span class="c1">// false! type=*MyErr, data=nil</span><span class="w">
</span></span></span></code></pre></div><h4 id="loop-variable-pitfall">Loop Variable Pitfall</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Loop variables reuse same memory location</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Be careful in goroutines/closures</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Wrong</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">go</span><span class="w"> </span><span class="kd">func</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="p">)</span><span class="w">  </span><span class="c1">// May all print 2, 3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Correct: rebind</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">}</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="w">  </span><span class="c1">// Create new local variables</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">go</span><span class="w"> </span><span class="kd">func</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">v</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h4 id="method-call-auto-conversion">Method Call Auto-conversion</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Compiler automatically handles value/pointer conversion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">S</span><span class="w"> </span><span class="kd">struct</span><span class="p">{</span><span class="w"> </span><span class="nx">n</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">s</span><span class="w"> </span><span class="o">*</span><span class="nx">S</span><span class="p">)</span><span class="w"> </span><span class="nf">Inc</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">s</span><span class="p">.</span><span class="nx">n</span><span class="o">++</span><span class="w"> </span><span class="p">}</span><span class="w">  </span><span class="c1">// Pointer receiver</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">v</span><span class="w"> </span><span class="nx">S</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">v</span><span class="p">.</span><span class="nf">Inc</span><span class="p">()</span><span class="w">    </span><span class="c1">// Compiler converts to (&amp;v).Inc()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">p</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">S</span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">(</span><span class="o">*</span><span class="nx">p</span><span class="p">).</span><span class="nf">Inc</span><span class="p">()</span><span class="w"> </span><span class="c1">// Works but unnecessary</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">p</span><span class="p">.</span><span class="nf">Inc</span><span class="p">()</span><span class="w">    </span><span class="c1">// Direct call</span><span class="w">
</span></span></span></code></pre></div><h4 id="struct-embedding-anonymous-fields">Struct Embedding (Anonymous Fields)</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Embedded field methods and properties are &#34;promoted&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">A</span><span class="w"> </span><span class="kd">struct</span><span class="p">{</span><span class="w"> </span><span class="nx">X</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">a</span><span class="w"> </span><span class="nx">A</span><span class="p">)</span><span class="w"> </span><span class="nf">Show</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">X</span><span class="p">)</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">B</span><span class="w"> </span><span class="kd">struct</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">A</span><span class="w">          </span><span class="c1">// Anonymous embedding</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Y</span><span class="w"> </span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">b</span><span class="w"> </span><span class="nx">B</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">b</span><span class="p">.</span><span class="nx">X</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">1</span><span class="w">        </span><span class="c1">// Direct access, equivalent to b.A.X</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">b</span><span class="p">.</span><span class="nf">Show</span><span class="p">()</span><span class="w">       </span><span class="c1">// Calls A&#39;s method</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// With name conflicts, must specify explicitly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">C</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">A</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">X</span><span class="w"> </span><span class="kt">int</span><span class="w">      </span><span class="c1">// Shadows A.X</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nx">c</span><span class="w"> </span><span class="nx">C</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">c</span><span class="p">.</span><span class="nx">X</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">1</span><span class="w">        </span><span class="c1">// Accesses C.X</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">c</span><span class="p">.</span><span class="nx">A</span><span class="p">.</span><span class="nx">X</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">2</span><span class="w">      </span><span class="c1">// Accesses A.X</span><span class="w">
</span></span></span></code></pre></div><h4 id="init-functions-and-package-imports">init Functions and Package Imports</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// init() executes automatically on package load</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Order: imported package init -&gt; current package init -&gt; main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nx">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">_</span><span class="w"> </span><span class="s">&#34;database/sql&#34;</span><span class="w">      </span><span class="c1">// Only execute init, don&#39;t use exports</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">_</span><span class="w"> </span><span class="s">&#34;github.com/go-sql-driver/mysql&#34;</span><span class="w">  </span><span class="c1">// Register MySQL driver</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">init</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;main init&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Database driver already registered in init</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Simple Tree Traversal</title><link>https://www.parkerchenca.com/tech/simple-tree-traversal/</link><pubDate>Thu, 10 Sep 2026 11:21:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/simple-tree-traversal/</guid><description>Understanding the &amp;#39;Movement&amp;#39; within the tree</description><content:encoded><![CDATA[<h2 id="-leaf-similar-trees-leetcode-872">🖋️ Leaf-Similar Trees (Leetcode 872)</h2>
<p><img loading="lazy" src="https://assets.leetcode.com/uploads/2020/09/03/leaf-similar-1.jpg"></p>
<p>In short, we are gonna to compare the leaves between two tree.</p>
<p>First, we should get the elements from the leaves.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Definition for a binary tree node.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># class TreeNode:</span>
</span></span><span class="line"><span class="cl"><span class="c1">#     def __init__(self, val=0, left=None, right=None):</span>
</span></span><span class="line"><span class="cl"><span class="c1">#         self.val = val</span>
</span></span><span class="line"><span class="cl"><span class="c1">#         self.left = left</span>
</span></span><span class="line"><span class="cl"><span class="c1">#         self.right = right</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">dfs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">root</span><span class="p">,</span> <span class="n">list_para</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">temp</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">        <span class="n">curr</span> <span class="o">=</span> <span class="n">root</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">curr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">temp</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">while</span> <span class="n">curr</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">temp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">curr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="n">curr</span> <span class="o">=</span> <span class="n">curr</span><span class="o">.</span><span class="n">left</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="o">//</span> <span class="n">Save</span> <span class="nb">all</span> <span class="n">elements</span> <span class="n">on</span> <span class="n">the</span> <span class="n">left</span> <span class="n">side</span><span class="p">,</span> <span class="n">but</span>
</span></span><span class="line"><span class="cl">            <span class="o">//</span> <span class="n">we</span> <span class="n">only</span> <span class="n">want</span> <span class="n">the</span> <span class="n">leaf</span> <span class="n">element</span><span class="p">,</span> <span class="n">so</span><span class="o">...</span>
</span></span><span class="line"><span class="cl">            <span class="n">curr</span> <span class="o">=</span> <span class="n">temp</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">curr</span><span class="o">.</span><span class="n">left</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">curr</span><span class="o">.</span><span class="n">right</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">list_para</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">curr</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">curr</span> <span class="o">=</span> <span class="n">curr</span><span class="o">.</span><span class="n">right</span>
</span></span><span class="line"><span class="cl">            <span class="o">//</span> <span class="n">Attention</span> <span class="n">here</span><span class="p">,</span> <span class="n">we</span> <span class="s1">&#39;move&#39;</span> <span class="n">our</span> <span class="s1">&#39;pointer&#39;</span> <span class="n">to</span> <span class="n">the</span> <span class="n">right</span> <span class="n">side</span>
</span></span><span class="line"><span class="cl">            <span class="o">//</span> <span class="n">After</span> <span class="n">we</span> <span class="n">have</span> <span class="n">done</span> <span class="nb">all</span> <span class="n">the</span> <span class="n">things</span> <span class="n">we</span> <span class="n">should</span> <span class="n">do</span> <span class="n">on</span> <span class="n">the</span> <span class="n">left</span> <span class="n">side</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">leafSimilar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">root1</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">root2</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">l1</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">        <span class="n">l2</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dfs</span><span class="p">(</span><span class="n">root1</span><span class="p">,</span> <span class="n">l1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dfs</span><span class="p">(</span><span class="n">root2</span><span class="p">,</span> <span class="n">l2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">l1</span> <span class="o">==</span> <span class="n">l2</span>
</span></span></code></pre></div><h3 id="recursion-method"><strong>Recursion</strong> Method</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">dfs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">root</span><span class="p">,</span> <span class="n">list_para</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">root</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">root</span><span class="o">.</span><span class="n">left</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">root</span><span class="o">.</span><span class="n">right</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">list_para</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">//</span> <span class="o">**</span><span class="n">Move</span><span class="o">**</span> <span class="n">to</span> <span class="n">the</span> <span class="n">left</span><span class="p">,</span> <span class="n">do</span> <span class="n">it</span> <span class="n">again</span><span class="p">,</span> <span class="o">**</span><span class="n">until</span> <span class="s1">&#39;root is None&#39;</span><span class="o">**</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dfs</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="n">list_para</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="o">//</span> <span class="n">Left</span> <span class="n">side</span> <span class="n">finished</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="o">//</span> <span class="o">**</span><span class="n">Move</span><span class="o">**</span> <span class="n">to</span> <span class="n">the</span> <span class="n">right</span><span class="p">,</span> <span class="n">do</span> <span class="n">it</span> <span class="n">again</span><span class="p">,</span> <span class="o">**</span><span class="n">until</span> <span class="s1">&#39;root is None&#39;</span><span class="o">**</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dfs</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">right</span><span class="p">,</span> <span class="n">list_para</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				 <span class="o">//</span> <span class="n">Right</span> <span class="n">side</span> <span class="n">finished</span><span class="p">,</span> <span class="nb">all</span> <span class="n">required</span> <span class="n">data</span> <span class="ow">is</span> <span class="n">saved</span> <span class="ow">in</span> <span class="n">the</span> <span class="n">list_para</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="nf">leafSimilar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">root1</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">root2</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">l1</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">        <span class="n">l2</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dfs</span><span class="p">(</span><span class="n">root1</span><span class="p">,</span> <span class="n">l1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="bp">self</span><span class="o">.</span><span class="n">dfs</span><span class="p">(</span><span class="n">root2</span><span class="p">,</span> <span class="n">l2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">l1</span> <span class="o">==</span> <span class="n">l2</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>Rust Notes 3</title><link>https://www.parkerchenca.com/tech/rust-notes-3/</link><pubDate>Thu, 10 Sep 2026 11:16:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/rust-notes-3/</guid><description>Basic types 1</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
In the end, all data types in Rust come from these primitive types.</p>
</blockquote>
<h2 id="basic-types">Basic types</h2>
<ul>
<li>Every value in Rust has a specific data type</li>
<li>In general, these can be divided into two categories: <strong>scalar</strong> types and <strong>compound</strong> types</li>
<li>Scalar types include:
<ul>
<li><strong>Numbers</strong>: Signed integers (<code>i8</code>, <code>i16</code>, <code>i32</code>, <code>i64</code>, <code>isize</code>), unsigned integers (<code>u8</code>, <code>u16</code>, <code>u32</code>, <code>u64</code>, <code>usize</code>), floating-point numbers (<code>f32</code>, <code>f64</code>)
<ul>
<li>The <code>isize</code> and <code>usize</code> types depend on the architecture of the computer the program is running on: if the CPU is 32-bit, these types are 32-bit; similarly, if the CPU is 64-bit, they are</li>
<li>Rust&rsquo;s <strong>default</strong> integer type is <code>i32</code></li>
<li>Can overflow, and Rust does not check for this by default. If you encounter incorrect values, make sure to check the type of your numbers.</li>
</ul>
</li>
<li><strong>Strings</strong>: String literals and string slices</li>
<li><strong>Booleans</strong>: <code>true</code> and <code>false</code></li>
<li><strong>Characters</strong>: Representing a single Unicode character, stored as 4 bytes</li>
<li><strong>Unit type</strong>: Represented by <code>()</code>, with its only value also being <code>()</code></li>
</ul>
</li>
</ul>
<hr>
<h3 id="be-careful-with-floats">Be Careful with <code>float</code>s</h3>
<p>See this example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="fm">assert!</span><span class="p">(</span><span class="mf">0.1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">0.3</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>You might think this would return <code>true</code> , but the truth is, the program will panic and quit.</p>
<ul>
<li>Due to binary precision issues, <code>0.1 + 0.2</code> is not exactly equal to <code>0.3</code></li>
<li>You can consider using this approach: <code>(0.1_f64 + 0.2 - 0.3).abs() &lt; 0.00001</code></li>
</ul>
<hr>
<h3 id="nan">NaN</h3>
<ul>
<li><code>-42.1.sqrt()</code> will produce <code>NaN</code></li>
<li>Any operation involving <code>NaN</code> will return <code>NaN</code></li>
<li>Comparing <code>NaN</code> will cause the code to panic and crash</li>
<li>Use <code>is_nan()</code> to determine if a value is <code>NaN</code></li>
</ul>
<hr>
<h3 id="use"><strong>Use <code>as</code> for Type Conversion</strong></h3>
<p>In Rust, you can use <code>as</code> to convert one type to another.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span>: <span class="kt">i32</span> <span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">y</span>: <span class="kt">f64</span> <span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">f64</span><span class="p">;</span><span class="w"> </span><span class="c1">// Convert i32 to f64
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;x as f64 is: </span><span class="si">{}</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Rust Notes 2</title><link>https://www.parkerchenca.com/tech/rust-notes-2/</link><pubDate>Thu, 10 Sep 2026 11:15:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/rust-notes-2/</guid><description>Basic syntax: variable and function</description><content:encoded><![CDATA[<h2 id="syntax-of-rust">Syntax of Rust</h2>
<p>Don’t worry, this will be very easy at the beginning. (Really?)</p>
<hr>
<h3 id="function-goes-first">Function goes first</h3>
<ul>
<li>Similar to C and C++, there must be a <code>main</code> function as the entry point of the program.</li>
<li>Use <code>fn</code> to declare a function, so concise.</li>
<li>Use <code>()</code> for receiving parameters, and <code>{}</code> for the actual logic inside the function.</li>
<li>Remember to use <code>;</code> to end a statement. As I said, it’s similar to C and C++.</li>
<li>Example:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span>-&gt; <span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;Hello, world!&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// &#34;ln&#34; means print with a new line after the content
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// What is &#34;!&#34;? Well, it means this function is actually a macro
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// For now, let&#39;s just use it as is
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// You don&#39;t need to learn everything to start using Rust. Heart.
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>A complete structure of function head in Rust should be:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="n">keyword</span><span class="w"> </span><span class="n">name</span><span class="p">(</span><span class="n">parameter</span>: <span class="nc">type</span><span class="w"> </span><span class="p">)</span><span class="w"> </span>-&gt; <span class="p">[</span><span class="k">return</span><span class="w"> </span><span class="k">type</span><span class="p">]</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">body</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">fn</span>      <span class="nf">myFunction</span><span class="p">(</span><span class="n">para</span><span class="w"> </span>: <span class="kt">i32</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="kt">i32</span> <span class="p">{</span><span class="w"> </span><span class="o">..</span><span class="p">.</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><hr>
<h3 id="define-variables">Define variables</h3>
<ul>
<li>You <strong>must</strong> use <code>let</code> to create a variable.
<ul>
<li><code>let myVar = 3;</code></li>
<li><code>let myVar: u32 = 3;</code> → Explicitly specifies the type of the variable <code>myVar</code> as <code>u32</code>. <code>u32</code> is a 32-bit unsigned integer type in Rust.</li>
<li><code>let mut myVar = 3;</code> → Creates a <strong>mutable</strong> variable.</li>
</ul>
</li>
<li>What? Mutable?
<ul>
<li>Variables in Rust are <strong>immutable by default</strong>.(Its value is determined after compilation.)</li>
<li>It&rsquo;s important to understand that in Rust, <code>some_variable = some_value</code> is not just <strong>assigning</strong> a value, but rather <strong>binding</strong> the value to the variable.</li>
<li>This topic is related to Rust’s Ownership feature, which we will discuss in the next post.</li>
<li>Here&rsquo;s an example:</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">myVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">myVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">6</span><span class="p">;</span><span class="w"> </span><span class="c1">// Error
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">myMutVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">myMutVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">6</span><span class="p">;</span><span class="w"> </span><span class="c1">// Pass
</span></span></span></code></pre></div><ul>
<li>If you understand that variables are bound to values, it becomes easier to grasp <strong>variable destructuring</strong>:
<ul>
<li>Basically, destructuring means extracting values from patterns.</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">b</span><span class="p">)</span>: <span class="p">(</span><span class="kt">bool</span><span class="p">,</span><span class="kt">bool</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="kc">false</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;a = </span><span class="si">{:?}</span><span class="s">, b = </span><span class="si">{:?}</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// You can treat the {} as a placeholder for a or b
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// :? is for &#34;formatting&#34; output and &#34;debugging&#34; output
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Whatever, it should print the value of a and b
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">assert_eq!</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>You can also use <code>const</code> to define a constant value:
<ul>
<li><code>const MY_CONST_VALUE: i32 = 5;</code></li>
<li>Constants must always have a type annotation, unlike regular variables.</li>
</ul>
</li>
</ul>
<hr>
<h4 id="statement-and-expression"><strong>Statement and expression</strong></h4>
<ul>
<li>In short:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">add_with_extra</span><span class="p">(</span><span class="n">x</span>: <span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="n">y</span>: <span class="kt">i32</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="kt">i32</span>  <span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// Statement
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w"> </span><span class="c1">// Statement
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="c1">// Expression. Hey! Attention here! No &#34;;&#34; after the sentence!
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Also expression is expected to &#34;return&#34; something
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// So we can avoid to write &#34;return&#34; in the end of our fn
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// In other word, statament CANNOT return a value
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>Interesting facts:
<ul>
<li>In <code>let x = 1;</code>
<ul>
<li><code>x</code> is an expression</li>
<li><code>1</code> is an expression</li>
<li><code>let x = 1;</code> is a statement</li>
<li>Bound</li>
</ul>
</li>
</ul>
</li>
<li>Lastly, if an expression doesn’t return anything, it returns <code>()</code>
<ul>
<li><code>()</code> is both a type and a value, and the value is <code>()</code>.</li>
<li>You can treat the <code>()</code> as a <code>()</code>, yes, that is it.</li>
</ul>
</li>
</ul>
]]></content:encoded></item><item><title>Rust Notes 1</title><link>https://www.parkerchenca.com/tech/rust-notes-1/</link><pubDate>Thu, 10 Sep 2026 11:14:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/rust-notes-1/</guid><description>Hello world!</description><content:encoded><![CDATA[<h2 id="about-these-notes">About these notes</h2>
<p>These Rust notes are just a collection of my learning records. Since I&rsquo;m a beginner in Rust, these notes are more like quick references or supplements, rather than a comprehensive Rust tutorial. No matter what, I hope you can still find parts that are useful to you.</p>
<hr>
<h3 id="why-rust">Why rust？</h3>
<p>Rust&rsquo;s advantages include memory safety, high performance, and high productivity. To me, Rust appears to be one of the best implementations of C++. If you don&rsquo;t get into deeper topics and only use prepared libraries, Rust&rsquo;s syntax is simple and clear. Its built-in compiler cautions are also quite informative, which significantly decreases the amount of thinking required on developers.</p>
<p>However, Rust has been criticized for being &ldquo;too safe.&rdquo; If you want to dig deeper and truly utilize Rust, you&rsquo;ll have to deal with its complex and tedious safety mechanisms. A true dilemma exists: &ldquo;Why not use the more flexible C++, or Python, which offers quicker speed in development and a more strong ecosystem?&rdquo;</p>
<p>In my opinion, Rust is a &ldquo;balanced&rdquo; choice that addresses some shortcomings of mainstream languages. It is safer than C++ and performs better than Python. However, Rust has obvious drawbacks including an extremely high learning and development cost (which may be more difficult than learning C++). However, Rust is clearly a popular technology right now, and its ecosystem is rapidly expanding. Learning a challenging new language is never a terrible idea.</p>
<hr>
<h3 id="environment-prep">Environment prep</h3>
<ol>
<li>Follow the instructions at <a href="https://www.rust-lang.org/learn/get-started">https://www.rust-lang.org/learn/get-started</a> to install <strong>Rust</strong>.</li>
<li>Install VS Code.</li>
<li>Install the <strong>rust-analyzer</strong> extension in VS Code.</li>
<li>Well done! You’re now ready to write your first Rust program.</li>
</ol>
<p>Use Google or AI tools to help you do these tasks, you will deal with Google and AI all the time when you’re learning something new.</p>
<hr>
<h3 id="hello-world">Hello world</h3>
<ol>
<li>In VS Code, open a new folder.</li>
<li>Press `Ctrl + `` to open a new terminal, or you can follow the top menu tabs: &ldquo;Terminal&rdquo; -&gt; &ldquo;New Terminal&rdquo;.</li>
<li>Enter <code>cargo new helloworld</code> to create a new project named <code>helloworld</code>.
<ol>
<li><code>cargo</code> is like the <code>pip</code> in Python; it manages packages (libraries) in Rust.</li>
</ol>
</li>
<li>Go into the <code>src</code> folder, and you will find the <code>main.rs</code> file.</li>
<li>Enter <code>cargo run</code> in the terminal to directly run … oops! An error occurs.
<ol>
<li>You need to first navigate into the <code>helloworld</code> directory because that’s the project’s working directory.</li>
<li>Use <code>cd helloworld</code>, or open the folder again in VS Code, and then create a new terminal.</li>
<li>Enter <code>cargo run</code>.</li>
<li>Congratulations! You&rsquo;ve run your first Rust program!</li>
</ol>
</li>
</ol>
]]></content:encoded></item><item><title>Window Functions in SQL</title><link>https://www.parkerchenca.com/tech/window-functions-in-sql/</link><pubDate>Thu, 10 Sep 2026 11:13:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/window-functions-in-sql/</guid><description>Apply Aggregate Functions to Specific Data</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong></p>
<p>Boss: &ldquo;I need the average sales for 7 days.&rdquo;</p>
<p>Me: &ldquo;Sure! Which 7 days?&rdquo;</p>
<p>Boss: &ldquo;All the 7 days!&rdquo;</p>
<p>Me: &ldquo;Su…Sure…?&rdquo;</p>
</blockquote>
<h2 id="-window-functions">🖋️ Window Functions</h2>
<p>Window functions are generally applied after aggregate functions like <code>MAX()</code>, <code>MIN()</code>, <code>AVG()</code> to perform calculations <strong>across</strong> a set of table rows(days before, days after) that are related to the current row(current day).</p>
<h4 id="example-table-1-employees">Example Table 1: <code>employees</code></h4>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th>department_id</th>
					<th>salary</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
			</tr>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
			</tr>
	</tbody>
</table>
<h4 id="example-1-over-without-partitioning">Example 1: <code>OVER()</code> Without Partitioning</h4>
<p>Calculate the average salary for all employees:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">department_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">salary</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AVG</span><span class="p">(</span><span class="n">salary</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">()</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">avg_salary_all_departments</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employees</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th>department_id</th>
					<th>salary</th>
					<th><strong>avg_salary_all_departments</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
					<td>6250</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
					<td>6250</td>
			</tr>
	</tbody>
</table>
<h4 id="example-2-partition-by">Example 2: <code>PARTITION BY</code></h4>
<p>Calculate the average salary <strong>per</strong> department:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">department_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">salary</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">AVG</span><span class="p">(</span><span class="n">salary</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">department_id</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">avg_salary_per_department</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employees</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th>department_id</th>
					<th>salary</th>
					<th><strong>avg_salary_per_department</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
					<td>5500</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
					<td>7000</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
					<td>7000</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
					<td>7000</td>
			</tr>
	</tbody>
</table>
<h4 id="example-3-order-by-with-ranking">Example 3: <code>ORDER BY</code> with Ranking</h4>
<p>Rank employees <strong>by</strong> salary <strong>within</strong> their departments:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employee_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">department_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">salary</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">RANK</span><span class="p">()</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="n">PARTITION</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="o">**</span><span class="n">department_id</span><span class="o">**</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="o">**</span><span class="n">salary</span><span class="o">**</span><span class="w"> </span><span class="k">DESC</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="o">**</span><span class="n">salary_rank</span><span class="o">**</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">employees</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>employee_id</th>
					<th><strong>department_id</strong></th>
					<th><strong>salary</strong></th>
					<th><strong>salary_rank</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>2</td>
					<td>101</td>
					<td>6000</td>
					<td>1</td>
			</tr>
			<tr>
					<td>3</td>
					<td>101</td>
					<td>5500</td>
					<td>2</td>
			</tr>
			<tr>
					<td>1</td>
					<td>101</td>
					<td>5000</td>
					<td>3</td>
			</tr>
			<tr>
					<td>5</td>
					<td>102</td>
					<td>7200</td>
					<td>1</td>
			</tr>
			<tr>
					<td>4</td>
					<td>102</td>
					<td>7000</td>
					<td>2</td>
			</tr>
			<tr>
					<td>6</td>
					<td>102</td>
					<td>6800</td>
					<td>3</td>
			</tr>
	</tbody>
</table>
<hr>
<h4 id="example-table-2-orders">Example Table 2: <code>orders</code></h4>
<table>
	<thead>
			<tr>
					<th>order_id</th>
					<th>order_date</th>
					<th>order_total</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>2023-01-01</td>
					<td>100</td>
			</tr>
			<tr>
					<td>2</td>
					<td>2023-01-03</td>
					<td>200</td>
			</tr>
			<tr>
					<td>3</td>
					<td>2023-01-05</td>
					<td>150</td>
			</tr>
			<tr>
					<td>4</td>
					<td>2023-01-07</td>
					<td>250</td>
			</tr>
			<tr>
					<td>5</td>
					<td>2023-01-09</td>
					<td>300</td>
			</tr>
	</tbody>
</table>
<h4 id="example-4-range-with-date-intervals">Example 4: <code>RANGE</code> with Date Intervals</h4>
<p>Sum the total orders in the last 7 days for <strong>each row</strong>: (INTERVAL 6 because included CURRENT ROW)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_date</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_total</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">SUM</span><span class="p">(</span><span class="n">order_total</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">order_date</span><span class="w"> </span><span class="n">RANGE</span><span class="w"> </span><span class="k">BETWEEN</span><span class="w"> </span><span class="nb">INTERVAL</span><span class="w"> </span><span class="s1">&#39;6&#39;</span><span class="w"> </span><span class="k">DAY</span><span class="w"> </span><span class="n">PRECEDING</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="k">CURRENT</span><span class="w"> </span><span class="k">ROW</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">sum_last_7_days</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">orders</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>order_id</th>
					<th>order_date</th>
					<th>order_total</th>
					<th>sum_last_7_days</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>2023-01-01</td>
					<td>100</td>
					<td>100</td>
			</tr>
			<tr>
					<td>2</td>
					<td>2023-01-03</td>
					<td>200</td>
					<td>300</td>
			</tr>
			<tr>
					<td>3</td>
					<td>2023-01-05</td>
					<td>150</td>
					<td>450</td>
			</tr>
			<tr>
					<td>4</td>
					<td>2023-01-07</td>
					<td>250</td>
					<td>700</td>
			</tr>
			<tr>
					<td>5</td>
					<td>2023-01-09</td>
					<td>300</td>
					<td>950</td>
			</tr>
	</tbody>
</table>
<h4 id="example-5-rows-between-preceding-and-following">Example 5: <code>ROWS</code> Between Preceding and Following</h4>
<p>Calculate the sum of order totals for the current row and the 2 preceding rows:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_date</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">order_total</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">SUM</span><span class="p">(</span><span class="n">order_total</span><span class="p">)</span><span class="w"> </span><span class="n">OVER</span><span class="p">(</span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">order_date</span><span class="w"> </span><span class="k">ROWS</span><span class="w"> </span><span class="k">BETWEEN</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">PRECEDING</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="k">CURRENT</span><span class="w"> </span><span class="k">ROW</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">sum_last_3_orders</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">FROM</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">orders</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result:</strong></p>
<table>
	<thead>
			<tr>
					<th>order_id</th>
					<th>order_date</th>
					<th>order_total</th>
					<th>sum_last_3_orders</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>2023-01-01</td>
					<td>100</td>
					<td>100</td>
			</tr>
			<tr>
					<td>2</td>
					<td>2023-01-03</td>
					<td>200</td>
					<td>300</td>
			</tr>
			<tr>
					<td>3</td>
					<td>2023-01-05</td>
					<td>150</td>
					<td>450</td>
			</tr>
			<tr>
					<td>4</td>
					<td>2023-01-07</td>
					<td>250</td>
					<td>600</td>
			</tr>
			<tr>
					<td>5</td>
					<td>2023-01-09</td>
					<td>300</td>
					<td>700</td>
			</tr>
	</tbody>
</table>
<hr>
<h4 id="references-sheet">References sheet</h4>
<p>After max()…</p>
<ul>
<li><strong>OVER(…)</strong>: Applied <strong>over</strong> &hellip;</li>
<li><strong>PARTITION BY</strong>: Used to <strong>divide by</strong> &hellip;</li>
<li><strong>ORDER BY</strong> [DESC]</li>
<li><strong>ROWS</strong> <code>[BETWEEN...AND]</code>
<ol>
<li><code>n PRECEDING</code></li>
<li><code>n FOLLOWING</code></li>
<li><code>CURRENT ROW</code></li>
<li><code>UNBOUNDED PRECEDING</code> All before</li>
<li><code>UNBOUNDED FOLLOWING</code> All after</li>
</ol>
</li>
<li><strong>RANGE</strong> <code>[BETWEEN...AND]</code>
<ol>
<li><code>INTERVAL 'n' DAY</code></li>
</ol>
</li>
</ul>
]]></content:encoded></item><item><title>CO-STAR Template for ChatGPT</title><link>https://www.parkerchenca.com/tech/co-star-template-for-chatgpt/</link><pubDate>Thu, 10 Sep 2026 11:11:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/co-star-template-for-chatgpt/</guid><description>Getting ChatGPT to Do Exactly What You Need</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
If you use ChatGPT frequently, you&rsquo;ve probably encountered situations where it provides off-topic answers. Since we can&rsquo;t modify the model, the better approach is to rely on accurate prompts and additional context.</p>
</blockquote>
<h2 id="-main">🖋️ Main</h2>
<h4 id="let-chatgpt-answer-your-questions-accurately"><strong>Let ChatGPT Answer Your Questions Accurately!</strong></h4>
<p>First, you need to let ChatGPT know some personal information about you and how it should respond to you.</p>
<ol>
<li>Click on your profile picture at the top right corner.</li>
<li>Select &ldquo;Customize ChatGPT.&rdquo;</li>
<li>Hover over the &ldquo;Custom Instructions&rdquo; question mark on the right and fill in the information as guided.</li>
<li>Use the specific CO-STAR template in a new session.</li>
<li>Interact with ChatGPT.</li>
</ol>
<hr>
<h4 id="co-star-template">CO-STAR Template</h4>
<p>The CO-STAR template is a structured method that can help you communicate more clearly and effectively with ChatGPT. By providing context, objectives, style, tone, audience, and response format, you can explain exactly what you need from ChatGPT, and get replies that correspond more closely with your requirements.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># CO-STAR Template
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Template Example
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># Context
</span></span><span class="line"><span class="cl"># I am a university student majoring in computer science, writing a paper on the application of machine learning in financial analysis.
</span></span><span class="line"><span class="cl"># Objective
</span></span><span class="line"><span class="cl"># Please help me write a section about the advantages and challenges of machine learning in stock market prediction.
</span></span><span class="line"><span class="cl"># Style
</span></span><span class="line"><span class="cl"># The style should be academic, using formal and technical language.
</span></span><span class="line"><span class="cl"># Tone
</span></span><span class="line"><span class="cl"># The tone should be serious and professional, avoiding humor or overly casual expressions.
</span></span><span class="line"><span class="cl"># Audience
</span></span><span class="line"><span class="cl"># The target audience is researchers and professionals in finance and computer science who are familiar with the relevant terminology and concepts.
</span></span><span class="line"><span class="cl"># Response
</span></span><span class="line"><span class="cl"># Please provide the content in paragraph form, including clear arguments and supporting evidence.
</span></span></code></pre></div><p>You can simply copy and paste this template to use it! Or, here is a more detailed explanation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## Context
</span></span><span class="line"><span class="cl"># Provide relevant background information to help the model understand the current situation.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Objective
</span></span><span class="line"><span class="cl"># Clearly state your goal or the task you want ChatGPT to help you with.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Style
</span></span><span class="line"><span class="cl"># Specify the desired writing style, such as formal, informal, technical, etc.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Tone
</span></span><span class="line"><span class="cl"># Define the desired tone, such as persuasive, humorous, serious, etc.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Audience
</span></span><span class="line"><span class="cl"># Define the target audience so the model can adjust the complexity and terminology of its output.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Response
</span></span><span class="line"><span class="cl"># Specify the desired response format, such as a list, paragraph, or a specific data format.
</span></span></code></pre></div>]]></content:encoded></item><item><title>Tips for Better Google Searches</title><link>https://www.parkerchenca.com/tech/tips-for-better-google-searches/</link><pubDate>Thu, 10 Sep 2026 11:10:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/tips-for-better-google-searches/</guid><description>lmgtfy.(Let me google that for you)</description><content:encoded><![CDATA[<blockquote>
<p>💡 <strong>Prelude:</strong>
I collected some common advanced keywords for Google searching. These tips are generally applicable to most search engines.
You can also “search” on this page to find what you need.</p>
</blockquote>
<h3 id="exact-keywords">Exact Keywords</h3>
<p>Use <code>&quot;key words ...&quot;</code> (<strong>double quotes</strong>) to prevent keywords from being split up during the search.</p>
<hr>
<h3 id="exclude-keywords">Exclude Keywords</h3>
<p>Use <code>-</code> to exclude keywords.</p>
<p>For example:<code>python usage -w3s</code></p>
<hr>
<h3 id="wildcard">Wildcard</h3>
<p>The <code>*</code> in the search bar works similarly to the wildcard in Linux.</p>
<hr>
<h3 id="search-for-similar-words">Search for Similar Words</h3>
<p>Use the <code>~</code> symbol. For example, to search for words similar to &ldquo;elderly,&rdquo; input <code>~elderly</code>. This will return pages that include words like &ldquo;senior,&rdquo; &ldquo;older,&rdquo; &ldquo;aged,&rdquo; and more, in addition to &ldquo;elderly.&rdquo;</p>
<hr>
<h3 id="search-multiple-keywords">Search Multiple Keywords</h3>
<p>Use <code>|</code> to separate search terms.</p>
<p>You can also use <code>OR</code> and <code>AND</code> keywords. Make sure to use parentheses <code>()</code> to organize the structure of your search.</p>
<hr>
<h3 id="search-within-a-specific-website-site">Search Within a Specific Website: <code>site:</code></h3>
<p>Use <code>site:url (keywords)</code> before the search query.</p>
<p>You can use parentheses <code>()</code> around similar filters to better organize the search structure.</p>
<hr>
<h3 id="search-related-websites-related">Search Related Websites: <code>related:</code></h3>
<p>Using <code>related:</code> helps you find websites related to a specific site.</p>
<p>For example, searching for <code>&quot;related:runoob.com&quot;</code> will return all websites related to <code>runoob.com</code>.</p>
<hr>
<h3 id="time-range-daterange-after-before">Time Range: <code>daterange: AFTER: BEFORE</code></h3>
<p>Use <code>&quot;daterange:&quot;</code> to search for content within a specific time range. For example, searching for <code>&quot;marathon daterange:2011-01-01..2022-01-01&quot;</code> will return results related to marathons between 2011 and 2022.</p>
<p>Use <code>&quot;AFTER:2020&quot;</code> to get content after the year 2020, and so on.</p>
<hr>
<h3 id="search-for-keywords-in-titles-intitle">Search for Keywords in Titles: <code>intitle:</code></h3>
<p>Use <code>&quot;intitle:&quot;</code> to search for pages that have a certain keyword in the title tag. For example, searching for <code>&quot;intitle: Google&quot;</code> will return results with <code>Google</code> in the title.</p>
<hr>
<h3 id="specify-image-size-imagesize">Specify Image Size: <code>imagesize:</code></h3>
<p>Use syntax like <code>imagesize:500x500</code> to find images of a suitable size.</p>
<hr>
<h3 id="file-type-filetype">File Type: <code>filetype:</code></h3>
<p>Use <code>&quot;filetype:&quot;</code> to search for specific types of files. For example, searching for <code>&quot;Python manual filetype:pdf&quot;</code> will return all PDFs related to the Python manual.</p>
<hr>
<h3 id="find-cached-versions-of-web-pages">Find Cached Versions of Web Pages</h3>
<p>The <code>&quot;cache:&quot;</code> operator allows you to find cached versions of web pages. Google generates cached versions so users can access pages even when the website is down.</p>
<hr>
<h3 id="who-linked-to-this-image-src">Who Linked to This Image? <code>src:</code></h3>
<p>The <code>src:</code> search operator will return web pages that reference the image URL provided in the <code>src</code> attribute.</p>
]]></content:encoded></item><item><title>Choose your licenses</title><link>https://www.parkerchenca.com/tech/choose-your-licenses/</link><pubDate>Thu, 10 Sep 2026 11:09:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/choose-your-licenses/</guid><description>Common licenses in one table</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
I sometimes wonder if adding a license to my campus homework is too serious.
Nevertheless, I still will add it.</p>
</blockquote>
<h2 id="-main">🖋️ Main</h2>
<table>
	<thead>
			<tr>
					<th>License</th>
					<th>Version</th>
					<th>Include License</th>
					<th>Include Source Code</th>
					<th>Trademark</th>
					<th>Status Change</th>
					<th>Commercial Use</th>
					<th>Distribution</th>
					<th>Modification</th>
					<th>Patent Right</th>
					<th>Private Use</th>
					<th>License Transfer</th>
					<th>No Liability</th>
					<th>No Trademark</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Apache License</strong></td>
					<td>2.0</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
			</tr>
			<tr>
					<td><strong>FreeBSD License</strong></td>
					<td></td>
					<td>Yes</td>
					<td></td>
					<td></td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td>2-Clause BSD License</td>
					<td></td>
					<td>Yes</td>
					<td></td>
					<td></td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td><strong>GNU General Public License(GPL)</strong></td>
					<td>2.0</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>No</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td>GNU Lesser General Public License</td>
					<td>2.1</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>No</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td><strong>GNU General Public License</strong></td>
					<td>3.0</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>No</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td>GNU Lesser General Public License</td>
					<td>3.0</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>No</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td><strong>MIT License</strong></td>
					<td></td>
					<td>Yes</td>
					<td></td>
					<td></td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
			</tr>
			<tr>
					<td><strong>Mozilla Public License(MPL)</strong></td>
					<td>2.0</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>No</td>
					<td>Yes</td>
					<td>Yes</td>
			</tr>
			<tr>
					<td>Eclipse Public License</td>
					<td>1.0</td>
					<td>Yes</td>
					<td>Yes</td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>No</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td>Affero General Public License</td>
					<td>3.0</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>No</td>
					<td>Yes</td>
					<td></td>
			</tr>
			<tr>
					<td>General Copyright</td>
					<td></td>
					<td>Yes</td>
					<td></td>
					<td></td>
					<td>Yes</td>
					<td>Yes</td>
					<td>Yes</td>
					<td>No</td>
					<td>No</td>
					<td>Yes</td>
					<td>No</td>
					<td></td>
					<td></td>
			</tr>
	</tbody>
</table>
<h3 id="in-short">In short?</h3>
<ol>
<li><strong>Completely Open Source</strong> -&gt; MIT License, BSD License</li>
<li><strong>Open Source, But Must Credit the Original Author</strong> -&gt; Apache License 2.0</li>
<li><strong>Open Source, Must Use the Same License (Copyleft)</strong> -&gt; GPL</li>
<li><strong>Allows Commercial Use</strong> -&gt; MIT License, BSD License, Apache License 2.0, GPL</li>
<li><strong>Allows Closed Source (Can Be Integrated into Proprietary Software)</strong> -&gt; MIT License, BSD License, Apache License 2.0</li>
<li><strong>Does Not Allow Closed Source (Must Remain Open Source)</strong> -&gt; GPL</li>
</ol>
]]></content:encoded></item></channel></rss>