<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>100 Go Mistakes on maladroit.dev</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/</link><description>Recent content in 100 Go Mistakes on maladroit.dev</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://maladroit.dev/kb/computer-engineering/100-go-mistakes/index.xml" rel="self" type="application/rss+xml"/><item><title>Any says nothing</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/any-says-nothing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/any-says-nothing/</guid><description>&lt;p&gt;The empty &lt;code&gt;interface{}&lt;/code&gt; or &lt;code&gt;any&lt;/code&gt; is considered to be an over-generalization.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Using the &lt;code&gt;any&lt;/code&gt; or &lt;code&gt;interface{}&lt;/code&gt; when there needs to be expression for the value
in question.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Replace &lt;code&gt;any&lt;/code&gt; with structs or generics. Only consider it when we truly do not
care what the data is like with &lt;code&gt;json.Marshal(value any) ([]byte, error)&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Being confused about nil and the empty slice</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-confused-about-nil-and-the-empty-slice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-confused-about-nil-and-the-empty-slice/</guid><description>&lt;p&gt;A slice is empty if it&amp;rsquo;s length is zero. A slice is nil if it is nil.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Not being educated on the differences between the two.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;A nil slice requires no allocation and because of this we should favor returning
nil slices as a result&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// if we don&amp;#39;t know the length and the slice can be empty&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// another way to create a nil and empty slice that can be helpful&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;append&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt; &lt;span style="color:#f6c177"&gt;42&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// If we know the future length&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;length&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// Avoid this style unless we are initializing with elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Being confused about when to use generics</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-confused-about-when-to-use-generics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-confused-about-when-to-use-generics/</guid><description>&lt;p&gt;Generics in Go are types that can be specified later. Before generics were added
to Go, handling similar functionality across types was a chore. With generics we
can leverage the following builtin type constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;any&lt;/li&gt;
&lt;li&gt;comparable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or we can define a custom constraint:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customConstraint&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;~&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;|&lt;/span&gt; &lt;span style="color:#908caa"&gt;~&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this constraint only supports ints and strings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;int&lt;/code&gt; is a restriction to specifically an int while &lt;code&gt;~int&lt;/code&gt; supports all values
whose underlying type is int&lt;/p&gt;</description></item><item><title>Being puzzled about channel size</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-puzzled-about-channel-size/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-puzzled-about-channel-size/</guid><description>&lt;p&gt;An unbuffered channel, or a synchronous channel, has a size of zero and blocks.
A buffered channel, or asynchronous channel, has some size and is unblocking
until it becomes full.&lt;/p&gt;
&lt;p&gt;For worker-pool patterns, the channel size should be the same as the number of
workers. For rate-limiting, the channel size should be set in accordance to the
resource we are limited by.&lt;/p&gt;
&lt;p&gt;Outside of these use-cases, using a different channel size should be done with
caution and should likely include a comment on the rationale behind that number.
The smaller the value, the more CPU contention we can handle. The larger the
number, the more memory we need to allocate.&lt;/p&gt;</description></item><item><title>Being puzzled about when to use channels or mutexes</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-puzzled-about-when-to-use-channels-or-mutexes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/being-puzzled-about-when-to-use-channels-or-mutexes/</guid><description>&lt;p&gt;In Go, channels are a communication mechanism that can be used to send and
receive values. Channels can be either unbuffered, blocks until receiver is
ready, or they can be buffered, blocks when the buffer is full.&lt;/p&gt;
&lt;p&gt;For parallel goroutines, a mutex is necessary for synchronization. For
coordination or communication, a channel is necessary.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Checking an error type inaccurately</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/checking-an-error-type-inaccurately/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/checking-an-error-type-inaccurately/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This stops working with wrapped errors&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;switch&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;transientError&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusServiceUnavailable&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;default&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusBadRequest&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use the &lt;code&gt;errors.As()&lt;/code&gt; function&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;As&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;transientError&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusServiceUnavailable&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusBadRequest&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Checking an error value inaccurately</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/checking-an-error-value-inaccurately/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/checking-an-error-value-inaccurately/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ErrNoRows&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Is&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ErrNoRows&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Common JSON handling mistakes</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/common-json-handling-mistakes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/common-json-handling-mistakes/</guid><description>&lt;h2 id="type-embedding"&gt;Type embedding&lt;/h2&gt;
&lt;h3 id="mistake"&gt;Mistake&lt;/h3&gt;
&lt;p&gt;This does not work because time.Time implements the &lt;code&gt;json.Marshaler&lt;/code&gt; interface
and will clobber any sort of JSON marshaling we are trying to accomplish.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// embedded field&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;event&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;123456&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Now&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;json&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Marshal&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;event&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix"&gt;Fix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively we could chose to implement the &lt;code&gt;json.Marshaler&lt;/code&gt; interface&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;e&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;MarshalJSON&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;json&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Marshal&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// leveraging an anonymous struct&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;e&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;e&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-monotonic-clock"&gt;The monotonic clock&lt;/h2&gt;
&lt;p&gt;An OS handles two types of clocks:&lt;/p&gt;</description></item><item><title>Common SQL mistakes</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/common-sql-mistakes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/common-sql-mistakes/</guid><description>&lt;h2 id="sqlopen"&gt;sql.Open&lt;/h2&gt;
&lt;h3 id="mistake"&gt;Mistake&lt;/h3&gt;
&lt;p&gt;This does not always open the connection, it merely prepares it for later use.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Open&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;mysql&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;dsn&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix"&gt;Fix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Open&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;mysql&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;dsn&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Ping&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="connection-pooling"&gt;Connection pooling&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sql.Open&lt;/code&gt; doesn&amp;rsquo;t return a single connection, but a pool of connections. We can
modify how this pool behaves with the following methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SetMaxOpenConns()&lt;/li&gt;
&lt;li&gt;SetMaxIdleConns()&lt;/li&gt;
&lt;li&gt;SetConnMaxIdleTime()&lt;/li&gt;
&lt;li&gt;SetConnMaxLifetime()&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="not-using-prepared-statements"&gt;Not using prepared statements&lt;/h2&gt;
&lt;p&gt;A prepared statement is a feature most SQL databases implement to execute a
repeated SQL statement. This is in the interest of efficiency as well as it
reduces the risk of SQL injections.&lt;/p&gt;</description></item><item><title>Comparing values incorrectly</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/comparing-values-incorrectly/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/comparing-values-incorrectly/</guid><description>&lt;p&gt;Comparing values in Go, using &lt;code&gt;==&lt;/code&gt; is not always appropriate.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;==&lt;/code&gt; and &lt;code&gt;!=&lt;/code&gt; do not work with slices and maps.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Consider using &lt;code&gt;reflect.DeepEqual()&lt;/code&gt;, but keep in mind this is significantly
slower than &lt;code&gt;==&lt;/code&gt;. If performance is critical, instead compare each element of
the slice/map through iteration.&lt;/p&gt;
&lt;p&gt;For testing solutions, consider external packages like &lt;code&gt;go-cmp&lt;/code&gt; or &lt;code&gt;testify&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Copying a sync type</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/copying-a-sync-type/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/copying-a-sync-type/</guid><description>&lt;p&gt;All primitive types in the &lt;code&gt;sync&lt;/code&gt; package follow one hard rule, they should
&lt;strong&gt;never&lt;/strong&gt; be copied.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sync.Cond&lt;/li&gt;
&lt;li&gt;sync.Map&lt;/li&gt;
&lt;li&gt;sync.Mutex&lt;/li&gt;
&lt;li&gt;sync.RWMutex&lt;/li&gt;
&lt;li&gt;sync.Once&lt;/li&gt;
&lt;li&gt;sync.Pool&lt;/li&gt;
&lt;li&gt;sync.WaitGroup&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This is an example of a data race from copying a sync primitive.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Counter&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;counters&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;map&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewCounter&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Counter&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Counter&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;counters&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;map&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// The function receiver here is a value so it is copied instead of referenced&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Counter&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Increment&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;name&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;counters&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;name&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Alternatively, we could make &lt;code&gt;Counter.mu&lt;/code&gt; a pointer to a &lt;code&gt;sync.Mutex&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Creating confusion with octal literals</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/creating-confusion-with-octal-literals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/creating-confusion-with-octal-literals/</guid><description>&lt;p&gt;Any integer literal in Go that begins with a &lt;code&gt;0&lt;/code&gt; is considered to be an octal&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// This equals 108, not 110&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;sum&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;100&lt;/span&gt; &lt;span style="color:#908caa"&gt;+&lt;/span&gt; &lt;span style="color:#f6c177"&gt;010&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use the long form prefix &lt;code&gt;0o&lt;/code&gt; for describing octals&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;sum&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;100&lt;/span&gt; &lt;span style="color:#908caa"&gt;+&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;o10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Creating data races with append</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/creating-data-races-with-append/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/creating-data-races-with-append/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This is a data race because the array is not full. Both goroutines will attempt
to update the same index in the backing array.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;s1&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;append&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;s2&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;append&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Instead we can copy the slice and append to that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;sCopy&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cap&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;copy&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sCopy&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;s1&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;append&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sCopy&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;sCopy&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cap&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;copy&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sCopy&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;s2&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;append&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sCopy&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Creating utility packages</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/creating-utility-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/creating-utility-packages/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Creating any package named &lt;code&gt;utils&lt;/code&gt;, &lt;code&gt;common&lt;/code&gt;, or &lt;code&gt;base&lt;/code&gt; is almost always
a mistake. They become junk drawers for unrelated functions and provide no
insight to what they provide.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use specific names when naming packages and, if necessary, break up utility
packages into smaller meaningful pieces.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Expecting deterministic behavior using select and channels</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/expecting-deterministic-behavior-using-select-and-channels/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/expecting-deterministic-behavior-using-select-and-channels/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Unlike the switch case, select case is random which case will be satisfied
first. If &lt;code&gt;messageCh&lt;/code&gt; is buffered, even if we had more messages to process on
the &lt;code&gt;messageCh&lt;/code&gt; when &lt;code&gt;disconnectCh&lt;/code&gt; receives a message it becomes random which
will be triggered.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;select&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;messageCh&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Print&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;disconnectCh&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;///////////&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;10&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;messageCh&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;disconnectCh&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use an unbuffered channel so that it blocks and guarantees all messages are
delivered. We could also use a single channel instead of two.&lt;/p&gt;</description></item><item><title>Forgetting about possible side effects with string formatting</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/forgetting-about-possible-side-effects-with-string-formatting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/forgetting-about-possible-side-effects-with-string-formatting/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;String&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RLock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RUnlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Sprintf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;id %s, age %s&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;age&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;age&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;age&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// This creates a deadlock because it will be calling the String() method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// through the Stringer interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Errorf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;age should be positive: %v&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;age&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;String&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RLock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RUnlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Sprintf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;id %s, age %s&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;age&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;age&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;age&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Errorf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;age should be positive: %v&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;age&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Forgetting about sync.Cond</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/forgetting-about-sync-cond/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/forgetting-about-sync-cond/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This example works but contains a CPU burner loop. It wastes a lot of cycles
checking if the donation goal has been met. This could be eliminated by using
a shared channel between the two goroutines, but we introduce another problem
where we could surpass our goal for one goroutine while the other goroutine is
using that channel.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Donation&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RWMutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;f&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;goal&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RLock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;goal&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RUnlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RLock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RUnlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;f&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;10&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;f&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;15&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Sleep&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Donation&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cond&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;NewCond&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;f&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;goal&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;L&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;goal&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// blocks until condition is met/broadcast&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// cond.Wait() does the following:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// - Unlock the mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// - Suspend the goroutine until a notification is received&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// - Lock the mutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Wait&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;L&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;f&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;10&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;f&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;15&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Sleep&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;L&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;L&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// broadcast that a condition was met&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;donation&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cond&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Broadcast&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Forgetting the return after replying to an HTTP request</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/forgetting-the-return-after-replying-to-an-http-request/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/forgetting-the-return-after-replying-to-an-http-request/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ResponseWriter&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;req&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Request&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;req&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// this doesn&amp;#39;t stop the function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusInternalServerError&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ResponseWriter&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;req&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Request&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;req&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusInternalServerError&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Handling an error twice</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/handling-an-error-twice/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/handling-an-error-twice/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Logging an error in multiple places&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Log or return an error, never do both.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ignoring how arguments are evaluated in range loops</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-how-arguments-are-evaluated-in-range-loops/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-how-arguments-are-evaluated-in-range-loops/</guid><description>&lt;p&gt;When using a range loop, the provide expression is evaluated once.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#f6c177"&gt;3&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this will print 2, not 10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Don&amp;rsquo;t use the range variables if you are modifying the range expression.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#f6c177"&gt;3&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;a&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;])&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this will print 10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ignoring how defer arguments and receivers are evaluated</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-how-defer-arguments-and-receivers-are-evaluated/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-how-defer-arguments-and-receivers-are-evaluated/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;defer&lt;/code&gt; arguments are evaluated immediately. No matter what status is changed to
it will always be an empty string for these two defer statements. The same holds
true for function receivers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;f&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;status&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;notify&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;status&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;incrementCounter&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;status&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Passing a pointer would allow mutations to the status variable to be reflected
by defer. Using a pointer receiver would have the same effect.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;f&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;status&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;notify&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;status&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;incrementCounter&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;status&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ignoring how the break statement works</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-how-the-break-statement-works/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-how-the-break-statement-works/</guid><description>&lt;p&gt;A &lt;code&gt;break&lt;/code&gt; statement is commonly used to terminate the execution of a loop.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;5&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;switch&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;default&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;break&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this will break the switch statement not the loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Using a label&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;loop&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;5&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;switch&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;default&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;break&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ignoring package name collisions</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-package-name-collisions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-package-name-collisions/</guid><description>&lt;p&gt;Package name collisions occur when a variable or function shares the same name
as a package.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Package declaration&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c4a7e7"&gt;package&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;//...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewClient&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;//...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;key&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Client implementation&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;redis&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;redis&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;NewClient&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;redis&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The redis variable now makes the redis package inaccessible in this scope&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use an import alias or change the variable name.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ignoring the fact that elements are copied in range loops</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-the-fact-that-elements-are-copied-in-range-loops/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-the-fact-that-elements-are-copied-in-range-loops/</guid><description>&lt;p&gt;The &lt;code&gt;range&lt;/code&gt; keyword is a convenient way to iterate over data structures.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;range&lt;/code&gt; performs a copy on all the elements of the data structure.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;accounts&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;account&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;100.&lt;/span&gt;&lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;200.&lt;/span&gt;&lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;300.&lt;/span&gt;&lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;accounts&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;a&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1000&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// This will not modify the original slice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;accounts&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;account&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;100.&lt;/span&gt;&lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;200.&lt;/span&gt;&lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;300.&lt;/span&gt;&lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// using the index for the slice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;accounts&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;accounts&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;].&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1000&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// This modifies the accounts object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// classic for loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;accounts&lt;/span&gt;&lt;span style="color:#908caa"&gt;);&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;accounts&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;].&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1000&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// This modifies the accounts object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ignoring the impact of using pointer elements in range loops</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-the-impact-of-using-pointer-elements-in-range-loops/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-the-impact-of-using-pointer-elements-in-range-loops/</guid><description>&lt;p&gt;When not being careful, it&amp;rsquo;s possible to reference the wrong elements with range
loops.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Here we are referencing the range variable, customer, which will result in all
elements of the customers slice being the same value.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Store&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;storeCustomers&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customers&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customers&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// This pointer is to the range variable customer, not the customers slice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Store&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;storeCustomers&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customers&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customers&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// create a local variable first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;current&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ID&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;current&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ignoring when to wrap an error</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-when-to-wrap-an-error/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/ignoring-when-to-wrap-an-error/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Returning errors without context.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Wrap errors and provide context&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Errorf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;bar failed: %w&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Inaccurate string iteration</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/inaccurate-string-iteration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/inaccurate-string-iteration/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This does not print &lt;code&gt;ê&lt;/code&gt;, but instead prints &lt;code&gt;Ã&lt;/code&gt; and the length is printed to be
6 instead of 5. This is because the character &lt;code&gt;ê&lt;/code&gt; requires 2 bytes to store.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;hêllo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Printf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;position %d: %c\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Printf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;len=%d\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use range variables&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;hêllo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;r&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Printf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;position %d: %c\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cast the string to a rune slice&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;hêllo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;runes&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;rune&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;runes&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Printf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;position %d: %c\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;runes&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Inefficient map initialization</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/inefficient-map-initialization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/inefficient-map-initialization/</guid><description>&lt;p&gt;In Go a map is an unordered key value pair where all keys are distinct.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;map&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;one&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;two&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;three&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;3&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;When a map grows, it doubles the number of buckets used to back it. This occurs
when the average number of items in the buckets is greater than a constant value
(6.5) or too many buckets have overflowed. When the map grows, all keys are
dispatched again to all buckets which can become expensive with large maps.&lt;/p&gt;</description></item><item><title>Inefficient slice initialization</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/inefficient-slice-initialization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/inefficient-slice-initialization/</guid><description>&lt;p&gt;When initializing a slice using &lt;code&gt;make&lt;/code&gt; we can provide a length and an optional
capacity.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Not giving a slice enough capacity when we know it will grow in size. In Go,
a slice is resized by doubling it&amp;rsquo;s capacity and allocating a new backing array.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;If we know a slice will grow substantially, we should give it enough capacity to
minimize the number of allocations it will require.&lt;/p&gt;</description></item><item><title>Interface on the producer side</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/interface-on-the-producer-side/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/interface-on-the-producer-side/</guid><description>&lt;p&gt;Deciding where to implement an interface is a pretty common mistake. An
interface defined in the same package as the concrete implementation is referred
to as the &lt;strong&gt;Producer Side&lt;/strong&gt;. The &lt;strong&gt;Consumer Side&lt;/strong&gt; is considered to be an
interface defined in some external package where it is being used.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Creating an interface on the producer side. Interfaces are satisfied implicitly
in Go and because of this we should be trying to discover the abstraction, not
create it. Creating an interface on the producer side means the producer is
creating the abstraction for all it&amp;rsquo;s consumers.&lt;/p&gt;</description></item><item><title>Interface pollution</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/interface-pollution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/interface-pollution/</guid><description>&lt;p&gt;Interfaces are one of the most valuable tools for structuring Go code and as a
result they are often abused creating unnecessary abstractions and difficult to
follow code.&lt;/p&gt;
&lt;p&gt;Creating interfaces and abstractions early. We should not be creating an
interface before their is code to implement it. Abstractions should be
discovered, not created.&lt;/p&gt;
&lt;h2 id="common-behavior"&gt;Common behavior&lt;/h2&gt;
&lt;p&gt;Consider the &lt;code&gt;sort&lt;/code&gt; interface which is incredibly common&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Interface&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;Len&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;Less&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;j&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;bool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;Swap&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;j&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="decoupling"&gt;Decoupling&lt;/h2&gt;
&lt;h3 id="coupled"&gt;Coupled&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;CustomerService&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;store&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;mysql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Store&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cs&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;CustomerService&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;CreateNewCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;id&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cs&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;store&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StoreCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="decoupled-using-an-interface"&gt;Decoupled using an interface&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customerStorer&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;StoreCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;CustomerService&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;storer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customerStorer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;cs&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;CustomerService&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;CreateNewCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;id&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cs&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;storer&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StoreCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="restricting-behavior"&gt;Restricting Behavior&lt;/h2&gt;
&lt;h3 id="concrete-implementation"&gt;Concrete implementation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;IntConfig&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;IntConfig&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// Retrieve configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;IntConfig&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Set&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;value&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// Update configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="restricted-implementation-using-an-interface"&gt;Restricted implementation using an interface&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;intConfigGetter&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;threshold&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;intConfigGetter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewFoo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;threshold&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;intConfigGetter&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;threshold&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;threshold&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;f&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Bar&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;threshold&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;f&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;threshold&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Making wrong assumptions during map iterations</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/making-wrong-assumptions-during-map-iterations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/making-wrong-assumptions-during-map-iterations/</guid><description>&lt;p&gt;There are two primary misconceptions with map iterations in Go.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;h3 id="ordering"&gt;Ordering&lt;/h3&gt;
&lt;p&gt;Order is not preserved in a map in Go. Iterating over a map multiple times will
likely result in a unique ordering for each iteration.&lt;/p&gt;
&lt;h3 id="map-insert-during-iteration"&gt;Map insert during iteration&lt;/h3&gt;
&lt;p&gt;Updating a map&amp;rsquo;s contents during iteration is allowed, but can lead to
unpredictable results. When a map entry is created during iteration, it may be
produced during the iteration or skipped.&lt;/p&gt;</description></item><item><title>Maps and memory leaks</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/maps-and-memory-leaks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/maps-and-memory-leaks/</guid><description>&lt;p&gt;When maps grow and shrink, buckets need to be added to the underlying data
structure to support it.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;When shrinking a map, the elements will be garbage collected, however the
buckets will still remain.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Either create a new map and copy all the elements of the old map to it. This
would result in a brief window of high memory consumption considering the two
maps, but the old map would be eventually collected. Alternatively, make the
values pointers. Pointers take up less memory and even though the buckets will
still remain, there should be significantly less of them.&lt;/p&gt;</description></item><item><title>Missing code documentation</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/missing-code-documentation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/missing-code-documentation/</guid><description>&lt;p&gt;Every exported element should be documented.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Having no documentation, or worse bad documentation&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Documentation should be complete, punctuated sentences and should describe the
intent, not the implementation.&lt;/p&gt;
&lt;p&gt;Use the &lt;code&gt;Deprecated:&lt;/code&gt; comment in documentation to indicate that this is
deprecated. This is result in an LSP warning if it is being used.&lt;/p&gt;
&lt;p&gt;Constants and variables should convey purpose and content though content can be
just for internal purposes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// DefaultPermission is the default permission used by the store engine.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;const&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;DefaultPermission&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;o644&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// Need read and write accesses.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Packages should also provide some indicator to their scope. Keep the first line
short and concise as it will appear in the godocs.&lt;/p&gt;</description></item><item><title>Misunderstanding Go contexts</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misunderstanding-go-contexts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misunderstanding-go-contexts/</guid><description>&lt;p&gt;A Context carries a deadline, a cancellation signal, and other values across API
boundaries.&lt;/p&gt;
&lt;h2 id="deadline"&gt;Deadline&lt;/h2&gt;
&lt;p&gt;A deadline is a specific point in time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;time.Duration&lt;/li&gt;
&lt;li&gt;time.Time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a deadline is met then any ongoing activities using that context should be
stopped.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;h&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publishHandler&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publishPosition&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;position&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;flight&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Position&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// context with a deadline of 4 seconds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cancel&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WithTimeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Background&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#f6c177"&gt;4&lt;/span&gt;&lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cancel&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// safeguard to cancel the context goroutine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;pub&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Publish&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;position&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cancellation-signals"&gt;Cancellation signals&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;main&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cancel&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WithCancel&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Background&lt;/span&gt;&lt;span style="color:#908caa"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cancel&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this cancel signal gets called when main exits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;CreateFileWatcher&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;foo.txt&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="context-values"&gt;Context values&lt;/h2&gt;
&lt;p&gt;Key value pairs can also be passed with a context&lt;/p&gt;</description></item><item><title>Misusing init functions</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misusing-init-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misusing-init-functions/</guid><description>&lt;p&gt;The &lt;code&gt;init()&lt;/code&gt; function in go is a function that is initialized first in the
package. The order of evaluation is&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Constants and variables&lt;/li&gt;
&lt;li&gt;Dependency &lt;code&gt;init()&lt;/code&gt;s in alphabetical order&lt;/li&gt;
&lt;li&gt;Main package &lt;code&gt;init()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main()&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Error management in &lt;code&gt;init()&lt;/code&gt; functions is limited since they do not return
errors. The only way to indicate that something has gone wrong in an &lt;code&gt;init()&lt;/code&gt; is
to &lt;strong&gt;panic&lt;/strong&gt;. This behavior should &lt;strong&gt;not&lt;/strong&gt; be left to the package to decide
whether to stop an application or not.&lt;/p&gt;</description></item><item><title>Misusing sync.WaitGroup</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misusing-sync-waitgroup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misusing-sync-waitgroup/</guid><description>&lt;p&gt;&lt;code&gt;sync.WaitGroup&lt;/code&gt; is a mechanism to wait for &lt;code&gt;n&lt;/code&gt; operations to complete.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This is a data race, there is no guarantee that another goroutine will be
started before the wg.Done() method is called causing the wg.Wait() to stop
blocking.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WaitGroup&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;uint64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;3&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;atomic&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;AddUint64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Done&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this is a data race&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Wait&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;We can move the &lt;code&gt;wg.Add(1)&lt;/code&gt; outside of the goroutine or alternatively we could
call &lt;code&gt;wg.Add(3)&lt;/code&gt; outside of the for loop.&lt;/p&gt;</description></item><item><title>Misusing trim functions</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misusing-trim-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/misusing-trim-functions/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;TrimRight removes all trailing runes in a given set.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;strings&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;TrimRight&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;123oxo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;xo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// &amp;#34;123&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;TrimSuffix removes a trailing suffix&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;strings&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;TrimRight&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;123oxo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;xo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// &amp;#34;123o&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mixing up concurrency and parallelism</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/mixing-up-concurrency-and-parallelism/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/mixing-up-concurrency-and-parallelism/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Assuming the two are synonymous.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Parallelism is every part of a system being independent. Concurrency provides
a structure to solve a problem with parts that may be parallelized.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Neglecting integer overflows</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/neglecting-integer-overflows/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/neglecting-integer-overflows/</guid><description>&lt;p&gt;An integer overflow occurs when an arithmetic operation creates a value outside
the range that can be represented in bytes. In Go an integer overflow or
underflow is silent at run-time.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;counter&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int32&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;math&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MaxInt32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;counter&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// results in -2_147_483_648&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;IncInt&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;counter&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;counter&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;math&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MaxInt&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;panic&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;int overflow&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;counter&lt;/span&gt; &lt;span style="color:#908caa"&gt;+&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;AddInt&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;a&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;math&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MaxInt&lt;/span&gt;&lt;span style="color:#908caa"&gt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;panic&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;int overflow&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;+&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;MultiplyInt&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;a&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// If one of the operands is equal to 0, it directly returns 0.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;||&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;result&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt; &lt;span style="color:#908caa"&gt;||&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#6e6a86"&gt;// Checks if one of the return result operands is equal to 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;math&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MinInt&lt;/span&gt; &lt;span style="color:#908caa"&gt;||&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;math&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MinInt&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#6e6a86"&gt;// Checks if one of the operands is equal to math.MinInt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;panic&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;integer overflow&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;result&lt;/span&gt;&lt;span style="color:#908caa"&gt;/&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;a&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#6e6a86"&gt;// Checks if the multiplication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;panic&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;integer overflow&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#6e6a86"&gt;// leads to an integer overflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Never using named result parameters</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/never-using-named-result-parameters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/never-using-named-result-parameters/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Name result parameters should be used when would provide better context.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;locator&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;getCoordinates&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;address&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;float32&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float32&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Name result parameters should not be used when they provide no value&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ReadFull&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Reader&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;buf&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;n&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;locator&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;getCoordinates&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;address&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;lng&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;lat&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float32&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ReadFull&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Reader&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;buf&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not being aware of data alignment</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-being-aware-of-data-alignment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-being-aware-of-data-alignment/</guid><description>&lt;p&gt;Data alignment is the concept of having a variable&amp;rsquo;s memory address be a
multiple of its size.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;byte, uint8, int8: 1 byte&lt;/li&gt;
&lt;li&gt;uint16, int16: 2 bytes&lt;/li&gt;
&lt;li&gt;uint32, int32, float32: 4 bytes&lt;/li&gt;
&lt;li&gt;uint64, int64, float64: 8 bytes&lt;/li&gt;
&lt;li&gt;complex128: 16 bytes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For all of these examples, their memory address is guaranteed to be some
multiple of their size. An int32 should have an address that is a multiple of 4.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Since &lt;code&gt;b1&lt;/code&gt; is a byte and &lt;code&gt;i&lt;/code&gt; is an int64, there is no way to align &lt;code&gt;i&lt;/code&gt; with
&lt;code&gt;b1&lt;/code&gt;, so we must pad the struct with 7 bytes of data to meet the alignment of
&lt;code&gt;i&lt;/code&gt;. This means we are using 24 bytes of memory to store 10 bytes of data.&lt;/p&gt;</description></item><item><title>Not being aware of the possible problems with type embedding</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-being-aware-of-the-problems-with-type-embedding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-being-aware-of-the-problems-with-type-embedding/</guid><description>&lt;p&gt;In Go, a struct field is embedded if it is declared without a name&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Bar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Bar&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Baz&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Baz&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Type embedding can sometimes expose fields and methods that outside sources
should not have access to. Consider the &lt;code&gt;Lock()&lt;/code&gt; and &lt;code&gt;Unlock()&lt;/code&gt; methods.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Only embed when you are confident the methods that are promoted will not cause
problems. Embedding is really just about convenience and if there is any doubt
it is probably best to just manually promote behaviors.&lt;/p&gt;</description></item><item><title>Not being careful with goroutines and loop variables</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-being-careful-with-goroutines-and-loop-variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-being-careful-with-goroutines-and-loop-variables/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;3&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// This is a closure and when it access `i` is not guaranteed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Print&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;3&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// this variable is now local to each scope&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;val&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Print&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;val&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;3&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// we pass the value as a parameter so it is evaluated immediately&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;val&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Print&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;val&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not categorizing tests</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-categorizing-tests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-categorizing-tests/</guid><description>&lt;h2 id="build-tags"&gt;Build tags&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;//go:build integration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c4a7e7"&gt;package&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db_test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go &lt;span style="color:#ea9a97"&gt;test&lt;/span&gt; --tags&lt;span style="color:#908caa"&gt;=&lt;/span&gt;integration -v .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="environment-variables"&gt;Environment variables&lt;/h2&gt;
&lt;p&gt;This provides information to the user that this test was skipped&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestInsert&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;os&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Getenv&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;INTEGRATION&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;true&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Skip&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;skipping integration test&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="short-mode"&gt;Short mode&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestLongRunning&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Short&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Skip&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;skipping long running test&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go &lt;span style="color:#ea9a97"&gt;test&lt;/span&gt; -short -v .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not closing transient resources</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-closing-transient-resources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-closing-transient-resources/</guid><description>&lt;h2 id="http-body"&gt;HTTP body&lt;/h2&gt;
&lt;h3 id="mistake"&gt;Mistake&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;client&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;url&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;h&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getBody&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// resp leaks here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;resp&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;client&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;url&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;body&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ReadAll&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;resp&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Body&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;body&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix"&gt;Fix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;client&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;url&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;h&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getBody&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;resp&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;client&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;url&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;resp&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Body&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;body&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ReadAll&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;resp&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Body&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;body&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sqlrows"&gt;sql.Rows&lt;/h2&gt;
&lt;h3 id="mistake-1"&gt;Mistake&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// rows leaks here keeping an open connection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;rows&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Query&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;SELECT * FROM customers&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix-1"&gt;Fix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;rows&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Query&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;SELECT * FROM customers&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;rows&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="osfile"&gt;os.File&lt;/h2&gt;
&lt;h3 id="mistake-2"&gt;Mistake&lt;/h3&gt;
&lt;p&gt;This is fine for reading from a file, but for writing we want to capture any
errors that may occur on the file close.&lt;/p&gt;</description></item><item><title>Not dealing with the time API efficiently</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-dealing-with-the-time-api-efficiently/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-dealing-with-the-time-api-efficiently/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;h3 id="implementation"&gt;Implementation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RWMutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;events&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Data&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TrimOlderThan&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;since&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Duration&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// this is very difficult to test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Now&lt;/span&gt;&lt;span style="color:#908caa"&gt;().&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;since&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;events&lt;/span&gt;&lt;span style="color:#908caa"&gt;);&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;events&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;].&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;After&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;events&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;events&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;:]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestCache_TrimOlderThan&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// if the machine becomes busy, we could easily miss this window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;events&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Now&lt;/span&gt;&lt;span style="color:#908caa"&gt;().&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;-&lt;/span&gt;&lt;span style="color:#f6c177"&gt;20&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Now&lt;/span&gt;&lt;span style="color:#908caa"&gt;().&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;-&lt;/span&gt;&lt;span style="color:#f6c177"&gt;10&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Now&lt;/span&gt;&lt;span style="color:#908caa"&gt;().&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;10&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cache&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;events&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;TrimOlderThan&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;15&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;GetAll&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;want&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;want&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Fatalf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;want: %d, got: %d&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;want&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;h3 id="function-type"&gt;Function type&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;now&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RWMutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;events&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;now&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewCache&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;events&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;now&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Now&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestCache_TrimOlderThan&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;events&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;parseTime&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;2020-01-01T12:00:00.04Z&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;parseTime&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;2020-01-01T12:00:00.05Z&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Timestamp&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;parseTime&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;2020-01-01T12:00:00.06Z&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cache&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;now&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;parseTime&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;2020-01-01T12:00:00.06Z&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;events&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;TrimOlderThan&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;15&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;parseTime&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;timestamp&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even better is to remove the &lt;code&gt;time.Duration&lt;/code&gt; from the parameter&lt;/p&gt;</description></item><item><title>Not enabling the -race flag</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-enabling-the-race-flag/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-enabling-the-race-flag/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go &lt;span style="color:#ea9a97"&gt;test&lt;/span&gt; -race -v .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not exploring all the Go test features</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-exploring-all-the-go-testing-features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-exploring-all-the-go-testing-features/</guid><description>&lt;h2 id="code-coverage"&gt;Code coverage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go &lt;span style="color:#ea9a97"&gt;test&lt;/span&gt; -coverpkg&lt;span style="color:#908caa"&gt;=&lt;/span&gt;./... -coverprofile&lt;span style="color:#908caa"&gt;=&lt;/span&gt;coverage.out ./...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go tool cover -html&lt;span style="color:#908caa"&gt;=&lt;/span&gt;coverage.out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="black-box-testing"&gt;Black box testing&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c4a7e7"&gt;package&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;counter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#c4a7e7"&gt;package&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;counter_test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utility-functions"&gt;Utility functions&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;createCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;createCustomer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;name&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Fatal&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="setup-and-tear-down"&gt;Setup and tear-down&lt;/h2&gt;
&lt;h3 id="per-function"&gt;Per function&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestMySQLIntegration&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;createConnection&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;tcp(localhost:3306)/db&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;createConnection&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;dsn&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;DB&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Open&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;mysql&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;dsn&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;FailNow&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cleanup&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="per-package"&gt;Per package&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestMain&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Main&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;setupMySQL&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;code&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Run&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;teardownMySQL&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;os&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Exit&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;code&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not handling an error</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-handling-an-error/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-handling-an-error/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Completely omitting the error.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;notify&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Acknowledging that an error was returned, but we are ignoring it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;_&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;notify&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not handling defer errors</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-handling-defer-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-handling-defer-errors/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Ignoring errors when using the defer keyword&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Closer&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getBalance&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;db&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;DB&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;clientID&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;float32&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;rows&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Query&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;query&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;clientID&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// if this errors, it will not be reported&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;rows&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use some defer technique to ensure that the error is handled or acknowledged in
some way.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Closer&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getBalance&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;db&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;sql&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;DB&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;clientID&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;float32&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;rows&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;db&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Query&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;query&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;clientID&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;rows&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;log&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Printf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;failed to close: %v&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not knowing how to reduce allocations</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-knowing-how-to-reduce-allocations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-knowing-how-to-reduce-allocations/</guid><description>&lt;h2 id="api-changes"&gt;API changes&lt;/h2&gt;
&lt;h3 id="mistake"&gt;Mistake&lt;/h3&gt;
&lt;p&gt;Returning a slice is &lt;strong&gt;sharing up&lt;/strong&gt; and causes the slice to escape the stack and
get allocated on the heap.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Reader&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Read&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;n&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;p&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix"&gt;Fix&lt;/h3&gt;
&lt;p&gt;Passing the slice as a parameter is an example of &lt;strong&gt;sharing down&lt;/strong&gt; and the slice
is able to be allocated on the stack instead of the heap.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Reader&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Read&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;p&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;n&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="compiler-optimizations"&gt;Compiler optimizations&lt;/h2&gt;
&lt;p&gt;In the event we would want to create a map with a &lt;code&gt;[]byte&lt;/code&gt; key, we would write
the following:&lt;/p&gt;</description></item><item><title>Not knowing which type of receiver to use</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-knowing-which-type-of-receiver-to-use/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-knowing-which-type-of-receiver-to-use/</guid><description>&lt;p&gt;In Go, you can have either a pointer or a value receiver.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This will not mutate the customer balance.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float64&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float64&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use pointer receivers for mutating an object. Use value receivers to keep an
object immutable.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not making slice copies correctly</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-making-slice-copies-correctly/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-making-slice-copies-correctly/</guid><description>&lt;p&gt;The builtin &lt;code&gt;copy&lt;/code&gt; function allows copying elements from one slice to another.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;The number of elements copied to the destination slice corresponds to the
minimum value between the source slice length and the destination slice length.
If the destination slice is an empty slice, then 0 elements will be copied.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use a destination slice with a length equal to or greater than the source slice&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;src&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;dest&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;src&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;copy&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;dest&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;src&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The alternative append form which is more concise, but less obvious&lt;/p&gt;</description></item><item><title>Not properly checking if a slice is empty</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-properly-checking-if-a-slice-is-empty/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-properly-checking-if-a-slice-is-empty/</guid><description>&lt;p&gt;What is the clear and concise method for checking if a slice has any elements?&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This handles the nil slice, but does not work for a slice with zero elements&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;slice&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;slice&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not relying on inlining</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-relying-on-inlining/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-relying-on-inlining/</guid><description>&lt;p&gt;Inlining is replacing a function call with the body of the function, usually
done automatically by the compiler. In Go, this can be observed by running
&lt;code&gt;go build -gcflags&lt;/code&gt;. This only works if the function falls within the &lt;strong&gt;inlining
budget&lt;/strong&gt;, otherwise the function is too complex to be inlined.&lt;/p&gt;
&lt;p&gt;Inlining offers two benefits: removing the function call overhead and enabling
more compiler optimizations. &lt;strong&gt;Mid-stack Inlining&lt;/strong&gt; is inlining functions that
call other functions. This is useful because it allows for &lt;strong&gt;fast-path
inlining&lt;/strong&gt;, distinguishing between fast and slow paths.&lt;/p&gt;</description></item><item><title>Not taking into account instruction-level parallelism</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-taking-into-account-instruction-level-parallelism/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-taking-into-account-instruction-level-parallelism/</guid><description>&lt;p&gt;Instruction level parallelism (ILP) is performance optimization that allows the
parallelization of a sequence of instructions. Instead of being a sum of the
instructions total execution time, our total time is just the length of
whichever instruction took the longest to execute.&lt;/p&gt;
&lt;p&gt;This can be incredibly beneficial, but it can lead to hazards. If one of the
instructions is dependent on another parallel instruction, like a conditional
operation, this is called a &lt;strong&gt;control/branching hazard&lt;/strong&gt;. CPU designers solved
this problem using &lt;strong&gt;branch prediction&lt;/strong&gt;. Using internal metrics, the CPU can
make a best guess at what the most likely branching path will be. In the event
that the CPU guesses incorrectly, the CPU will flush the current execution
pipeline to ensure there are no inconsistencies leading to a performance penalty
of ~10-20 cycles.&lt;/p&gt;</description></item><item><title>Not understanding CPU caches</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-cpu-caches/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-cpu-caches/</guid><description>&lt;h2 id="cpu-architecture"&gt;CPU Architecture&lt;/h2&gt;
&lt;p&gt;Modern CPUs rely on caching to speed up memory access. In most cases there are
three caching levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L1: ~1ns
&lt;ul&gt;
&lt;li&gt;L1D: data&lt;/li&gt;
&lt;li&gt;L1I: instructions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;L2: ~4ns&lt;/li&gt;
&lt;li&gt;L3: ~10ns&lt;/li&gt;
&lt;li&gt;Main Memory ~500-1,000ns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally a CPU can be hyper-threaded, where a physical core is split into
multiple logical cores (virtual cores). The L1 and L2 caches are &lt;strong&gt;on-die&lt;/strong&gt;,
meaning they are the same piece of silicon as the rest of the processor. The L3
cache is &lt;strong&gt;off-die&lt;/strong&gt;, making it much slower than the L1 and L2.&lt;/p&gt;</description></item><item><title>Not understanding floating points</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-floating-points/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-floating-points/</guid><description>&lt;p&gt;The concept of floating point numbers was created to solve the problem that
integer values cannot represent fractional numbers. Floating point numbers are
an approximation of real numbers due to the fact that their is an infinite
number of fractions between two integers.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Failing to understand the lack of precision with floating point numbers. Using
conditional comparisons like &lt;code&gt;==&lt;/code&gt; can result in unexpected behavior.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When comparing floating point numbers, check that the difference is within an
acceptable range&lt;/li&gt;
&lt;li&gt;When performing additions or subtractions, group operations with a similar
order of magnitude for better accuracy.&lt;/li&gt;
&lt;li&gt;to favor accuracy, if a sequence of operations requires addition, subtraction,
multiplication, or division, perform the multiplication and division
operations first.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not understanding how the GC works</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-how-the-gc-works/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-how-the-gc-works/</guid><description>&lt;p&gt;A GC keeps a tree of object references and the Go GC is based on the mark and
sweep algorithm.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mark stage: Traverse all objects on the heap and mark if they are in use&lt;/li&gt;
&lt;li&gt;Sweep stage: Traverse the tree of reference from the root and deallocate
objects that are no longer referenced&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a GC runs, it first performs a set of actions that lead to &lt;strong&gt;stopping the
world&lt;/strong&gt;. All available CPU time is used to perform the GC and the application is
put on hold until the GC is finished. The Go GC also includes a way to free
memory after consumption peak using a part of the GC called the &lt;strong&gt;periodic
scavenger&lt;/strong&gt;. After some time, the GC will detect that a large heap is no longer
necessary and will free some of it to the OS. This can be done manually with
&lt;code&gt;debug.FreeOSMemory()&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Not understanding race problems</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-race-problems/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-race-problems/</guid><description>&lt;p&gt;Race problems can be among the hardest and most insidious bugs to fix.&lt;/p&gt;
&lt;h2 id="multiple-goroutines-data-races"&gt;Multiple goroutines data races&lt;/h2&gt;
&lt;h3 id="mistake"&gt;Mistake&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix"&gt;Fix&lt;/h3&gt;
&lt;h4 id="using-atomic-operations"&gt;Using atomic operations&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;atomic&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;AddInt64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;atomic&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;AddInt64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="using-mutexes"&gt;Using mutexes&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mutex&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="using-channels"&gt;Using channels&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="channel-data-races"&gt;Channel data races&lt;/h2&gt;
&lt;h3 id="mistake-1"&gt;Mistake&lt;/h3&gt;
&lt;h4 id="synchronizing"&gt;Synchronizing&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// Racer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// Racer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="buffered-channels"&gt;Buffered channels&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{},&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// buffered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// A buffered receive happens before a send&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix-1"&gt;Fix&lt;/h3&gt;
&lt;h4 id="synchronizing-1"&gt;Synchronizing&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this receive blocks until channel send&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// alternatively we could close this channel for the same effect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}{}&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// channel send&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="buffered-channels-1"&gt;Buffered channels&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{})&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// unbuffered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;fmt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Println&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not understanding slice length and capacity</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-slice-length-and-capacity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-slice-length-and-capacity/</guid><description>&lt;p&gt;A slice is an array that can grow or shrink in size. In Go, a slice is backed by
an array, and handles the logic of adding new elements if the backing array is
full or shrinking it if it is almost empty.&lt;/p&gt;
&lt;p&gt;Internally, a slice holds a pointer to the backing array and keeps track of a
length and capacity. The length is the number of elements the slice contains,
while the capacity is the number of elements in the backing array.&lt;/p&gt;</description></item><item><title>Not understanding stack vs heap</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-stack-vs-heap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-stack-vs-heap/</guid><description>&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;p&gt;The stack is the default memory, a last in; first out (LIFO) data structure that
stores all the local variables for a specific goroutine. When a goroutine is
started it gets 2KB of contiguous memory as it&amp;rsquo;s stack space that can
grow/shrink at run-time. Moving between different functions creates a new stack
frame and allocates any variables necessary in that scope. Variables outside of
the stack frame still exist, but cannot be referenced in the new frame without
using a pointer.&lt;/p&gt;</description></item><item><title>Not understanding the concept of a rune</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-the-concept-of-a-rune/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-the-concept-of-a-rune/</guid><description>&lt;p&gt;In Go, a rune is a Unicode code point.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Believing that runes are always UTF8, this is false.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Runes can be any encoding.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not understanding the concurrency impacts of a workload type</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-the-concurrency-impacts-of-a-workload-type/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-the-concurrency-impacts-of-a-workload-type/</guid><description>&lt;p&gt;The execution time of a workload is limited by one of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU speed: CPU bound&lt;/li&gt;
&lt;li&gt;I/O speed: I/O bound&lt;/li&gt;
&lt;li&gt;Available memory: Memory bound&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;How do we parallelize this task?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;read&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Reader&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;count&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1024&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Read&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;EOF&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#3e8fb0"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;count&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;task&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;count&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;h3 id="worker-pooling-pattern"&gt;Worker-pooling pattern&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;read&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Reader&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;count&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WaitGroup&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// What we set `n` to largely is based on whether the task is IO or CPU bound&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// For I/O bound tasks, n should be some value that the system can handle.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Some trial and error may be necessary to determine this value.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// For CPU bound tasks, use GOMAXPROCS:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// n := runtime.GOMAXPROCS(0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;n&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Buffered channel and wait group are the same size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;n&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;n&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Create n goroutines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;n&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Done&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;task&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#ea9a97"&gt;atomic&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;AddInt64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;count&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;int64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1024&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#6e6a86"&gt;// Read from r to b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;close&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Wait&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;count&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not understanding the impacts of running Go in Docker and Kubernetes</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-the-impacts-of-running-go-in-docker-and-kubernetes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-understanding-the-impacts-of-running-go-in-docker-and-kubernetes/</guid><description>&lt;p&gt;It is important to understand the implications of running Go in
Docker/Kubernetes to prevent common situations such as CPU throttling. The
environment variable &lt;code&gt;GOMAXPROCS&lt;/code&gt; defines the limit of OS threads in charge of
executing user-level code simultaneously. This defaults to the number of OS
logical CPU cores. Consider the following Kubernetes spec:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;spec&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;containers&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ea9a97"&gt;name&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;image&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;resources&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;limits&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cpu&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;4000m&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;# 4 CPU cores&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We would expect &lt;code&gt;GOMAXPROCS&lt;/code&gt; to have a value of 4, but in this case it doesn&amp;rsquo;t.
It is set to 8 which is the number of cores on the host machine. With Kubernetes
Completely Fair Scheduler (CFS) our pod is given a budget of CPU time. In this
case, if we were using 8 threads at max capacity when our CPU resource limit was
defined as 4 cores we would have our application throttled half the time. At the
time this remains an open issue in Go, but can be solved with an import in
main.go:&lt;/p&gt;</description></item><item><title>Not using errgroup</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-errgroup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-errgroup/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This code correctly handles the aggregation of results with no data races, but
has no solution for error handling.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circles&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Circle&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Result&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;results&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Result&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;circles&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WaitGroup&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;results&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circles&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// variable shadowing to avoid data race&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Done&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;result&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ??????&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;results&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;wg&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Wait&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handle&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circles&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Circle&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Result&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;results&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Result&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;circles&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;g&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errgroup&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WithContext&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circles&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;g&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Go&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;result&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;circle&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;results&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;g&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Wait&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;results&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not using Go diagnostic tools</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-go-diagnostic-tools/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-go-diagnostic-tools/</guid><description>&lt;h2 id="profiling"&gt;Profiling&lt;/h2&gt;
&lt;p&gt;The following profiles can be collected from the go profiler, &lt;strong&gt;pprof&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;: where the application spends its time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Goroutine&lt;/strong&gt;: stack traces of the ongoing goroutines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heap&lt;/strong&gt;: heap memory allocations to monitor usage and check for leaks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mutex&lt;/strong&gt;: lock contentions to see mutex behavior and check if we are spending
too much time in locking calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt;: where goroutines block waiting on sync primitives&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="enabling-pprof"&gt;Enabling pprof&lt;/h3&gt;
&lt;p&gt;We can expose the data using the &lt;code&gt;net/http/pprof&lt;/code&gt; package at the url
&lt;code&gt;http://localhost/debug/pprof&lt;/code&gt;. This can even be used in
&lt;a href="https://go.dev/doc/diagnostics#profiling"&gt;production&lt;/a&gt;. The profiles that impact
performance are active for just short periods and must be enabled by default.&lt;/p&gt;</description></item><item><title>Not using linters</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-linters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-linters/</guid><description>&lt;p&gt;A linter is an automated tool for analyzing code and catching errors. Just
having a linter active in your code editor will catch a variety of mistakes like
variable shadowing.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Not using a linter.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use a linter or have code linted by CI.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not using nil channels</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-nil-channels/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-nil-channels/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;In this version, ch1 blocks ch2 until ch1 is closed. This would be a problem if
ch1 stays open forever.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;merge&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch2&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch1&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch2&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;close&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Make the channel nil when it is no longer open&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;merge&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch2&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch1&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;||&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch2&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;select&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;open&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch1&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#908caa"&gt;!&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;open&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch1&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;open&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch2&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#908caa"&gt;!&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;open&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch2&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;close&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not using notification channels</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-notification-channels/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-notification-channels/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This is 1 byte of storage&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;notification&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;bool&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;This takes zero bytes of storage&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;notification&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not using table driven tests</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-table-driven-tests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-table-driven-tests/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;removeNewLineSuffixes&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;strings&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;HasSuffix&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;\r\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;removeNewLineSuffixes&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;&lt;span style="color:#908caa"&gt;-&lt;/span&gt;&lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;strings&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;HasSuffix&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;removeNewLineSuffixes&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;&lt;span style="color:#908caa"&gt;-&lt;/span&gt;&lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestRemoveNewLineSuffix_Empty&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;removeNewLineSuffixes&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;expected&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;expected&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Errorf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;got: %s&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestRemoveLineSuffixes_CRNL&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;removeNewLineSuffixes&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;a\r\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;expected&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;expected&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Errorf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;got: %s&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestRemoveLineSuffixes_NL&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;removeNewLineSuffixes&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;a\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;expected&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;expected&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Errorf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;got: %s&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestRemoveNewLineSuffix&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;tests&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;map&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;input&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;want&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;empty&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;input&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;want&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;crnl&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;input&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;a\r\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;want&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;nl&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;input&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;a\n&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;want&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;name&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;tt&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;tests&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Run&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;name&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;removeNewLineSuffixes&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;tt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;input&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;tt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;want&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Errorf&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;got: %s, want: %s&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;tt&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;want&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can also make these sub-tests run in parallel&lt;/p&gt;</description></item><item><title>Not using test execution modes</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-test-execution-modes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-test-execution-modes/</guid><description>&lt;h2 id="parallel"&gt;Parallel&lt;/h2&gt;
&lt;p&gt;Parallel execution mode allows us to run specific tests in parallel. These tests
will run alongside other parallel tests. Any sequential tests will be executed
first.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestFoo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;t&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Parallel&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="shuffle"&gt;Shuffle&lt;/h2&gt;
&lt;p&gt;Randomize the execution order.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go &lt;span style="color:#ea9a97"&gt;test&lt;/span&gt; -shuffle&lt;span style="color:#908caa"&gt;=&lt;/span&gt;on -v .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not using testing utility packages</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-testing-utility-packages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-testing-utility-packages/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/net/http/httptest"&gt;httptest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/testing/iotest"&gt;iotest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Not using the functional options pattern</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-the-functional-options-pattern/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/not-using-the-functional-options-pattern/</guid><description>&lt;p&gt;For API design, how do we handle optional configurations?&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Using struct parameters or complicated builders to handle optional
configurations.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Config&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;Port&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewServer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;addr&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cfg&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Config&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// Initializes Port to 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;c1&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;httplib&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Config&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;Port&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// Port is missing, so it’s initialized to 0.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;c2&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;httplib&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Config&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Leverage closures and variadic arguments&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;options&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// we make this a pointer so that it can be nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// A function type that updates the options struct&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Option&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;WithPort&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Option&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;port should be positive&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// Accepts many option closures&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewServer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;addr&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;opts&lt;/span&gt; &lt;span style="color:#908caa"&gt;...&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Option&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Server&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// we create the options struct that the closures reference&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;options&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;opt&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;opts&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;opt&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// At this stage, the options struct is built and contains the config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// Therefore, we can implement our logic related to port configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;defaultHTTPPort&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;randomPort&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;options&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;port&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Overusing getters and setters</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/overusing-getters-and-setters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/overusing-getters-and-setters/</guid><description>&lt;p&gt;Data encapsulation refers to hiding the values and state of an object. Getters
and Setters are a means to enable encapsulation, yet Go has no automatic support
for getters or setters.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Providing a getter/setter for all struct attributes when it clearly is not
necessary.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use getters/setters for the following use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Encapsulating behavior for a field (validation, calculated value)&lt;/li&gt;
&lt;li&gt;Hiding internal representation (this should rarely be considered)&lt;/li&gt;
&lt;li&gt;Aid in debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Panicking</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/panicking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/panicking/</guid><description>&lt;p&gt;Once a panic is triggered, it continues up the call stack until either the
current goroutine has returned or panic is caught with recover.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Panicking any time an error occurs is a mistake.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Only panic when a programming error has occurred to signal that this mistake is
a bug and not a runtime error.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Project disorganization</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/project-disorganization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/project-disorganization/</guid><description>&lt;p&gt;Organizing a project in Go can be challenging. There is no enforced structure or
schema which can lead to code bases that are difficult to navigate.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Having no plan on how a project should be organized.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;There a many solutions for how to layout a project that all depend on the use
case.&lt;/p&gt;
&lt;h3 id="flat"&gt;Flat&lt;/h3&gt;
&lt;p&gt;For small projects it&amp;rsquo;s usually fine to just have a flat layout. There is no
need to over-complicate things.&lt;/p&gt;</description></item><item><title>Propagating an inappropriate context</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/propagating-an-inappropriate-context/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/propagating-an-inappropriate-context/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This creates a race condition between the two internal requests&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ResponseWriter&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Request&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;response&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;doSomeTask&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusInternalServerError&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publish&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;response&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// this is a race condition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// error handling&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;writeResponse&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;response&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// We wrap the context and implement the Context interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;detach&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;d&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;detach&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Deadline&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;bool&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Time&lt;/span&gt;&lt;span style="color:#908caa"&gt;{},&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;d&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;detach&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Done&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;d&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;detach&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Err&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;d&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;detach&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Value&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;key&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;any&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;any&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;d&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Value&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;key&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ResponseWriter&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Request&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;response&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;doSomeTask&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StatusInternalServerError&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Wrapping this detaches the cancellation signal while preserving the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// original Values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publish&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;detach&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;r&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;()},&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;response&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// error handling&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;writeResponse&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;response&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Providing a wrong time duration</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/providing-a-wrong-time-duration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/providing-a-wrong-time-duration/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;It is not obvious when this ticker will go off. We would assume every second,
but in fact it is ever microsecond.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ticker&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;NewTicker&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;1000&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;select&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ticker&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;C&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// tick&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Using the time durations provided from the &lt;code&gt;time&lt;/code&gt; package we can be certain how
this ticker works.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ticker&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;NewTicker&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;select&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ticker&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;C&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// tock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Returning a nil receiver</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/returning-a-nil-receiver/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/returning-a-nil-receiver/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Nil is a valid receiver in Go.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;errs&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;errs&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;append&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;errs&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// Satisfying the error interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Error&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;strings&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Join&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;errs&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Validate&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Age&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;age is negative&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Name&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;name is nil&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Even though m is nil, it is still a valid receiver.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// This will always return as an error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Customer&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Validate&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Age&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;age is negative&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Name&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;MultiError&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;m&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Add&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;name is nil&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Returning interfaces</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/returning-interfaces/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/returning-interfaces/</guid><description>&lt;p&gt;Returning an interface can result in dependency and import cycle hell.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Returning an interface&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Return structs and accept interfaces if at all possible. There are very few edge
cases where this makes sense and it should always be heavily scrutinized.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Sleeping in unit tests</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/sleeping-in-unit-tests/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/sleeping-in-unit-tests/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;h3 id="implementation"&gt;Implementation&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Handler&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;n&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;publisher&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publisher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publisher&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;interface&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Publish&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;h&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getBestFoo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;someInputs&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;foos&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getFoos&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;someInputs&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;best&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;foos&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;foos&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;n&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;foos&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;foos&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;n&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;publisher&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Publish&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;foos&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;best&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="test"&gt;Test&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publisherMock&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RWMutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;p&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;publisherMock&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Publish&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;p&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;p&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;p&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;got&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;p&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;publisherMock&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Foo&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;p&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;p&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;p&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;got&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;TestGetBestFoo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;t&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;T&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mock&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;publisherMock&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;h&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;publisher&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mock&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;n&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;h&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;getBestFoo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;42&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// this is very flaky, there is no guarantee this will be enough time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Sleep&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;10&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;published&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;mock&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Get&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use channels&lt;/p&gt;</description></item><item><title>Slices and memory leaks</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/slices-and-memory-leaks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/slices-and-memory-leaks/</guid><description>&lt;p&gt;Slicing an existing slice can lead to memory leaks under certain conditions.&lt;/p&gt;
&lt;h2 id="leaking-capacity"&gt;Leaking capacity&lt;/h2&gt;
&lt;h3 id="mistake"&gt;Mistake&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getMessageType&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;msg&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;msg&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#f6c177"&gt;5&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// This makes a slice with the same capacity as msg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix"&gt;Fix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getMessageType&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;msg&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;msgType&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;make&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;5&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;copy&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;msgType&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;msg&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;msgType&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="slices-and-pointers"&gt;Slices and pointers&lt;/h2&gt;
&lt;p&gt;When working with slices, if the element is a pointer or a struct with pointer
fields, it will not be collected by the garbage collector.&lt;/p&gt;
&lt;p&gt;Either make a copy of the slice to remove unwanted elements or set the remaining
slices to nil.&lt;/p&gt;</description></item><item><title>Starting a goroutine without knowing when to stop it</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/starting-a-goroutine-without-knowing-when-to-stop-it/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/starting-a-goroutine-without-knowing-when-to-stop-it/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;It is unclear when this goroutine will stop. The channel implementation in foo()
is unknown. If this never closes then it is a leak.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;We instead should be signaling resources letting them know it is time to close&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;main&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;newWatcher&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;newWatcher&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;watcher&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;watcher&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;go&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;watch&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;w&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;w&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;watcher&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;close&lt;/span&gt;&lt;span style="color:#908caa"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// close resource&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Substrings and memory leaks</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/substrings-and-memory-leaks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/substrings-and-memory-leaks/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;uuid&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;log&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#f6c177"&gt;36&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// slices the string, but keeps the backing array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;uuid&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;([]&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;byte&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;log&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#f6c177"&gt;36&lt;/span&gt;&lt;span style="color:#908caa"&gt;]))&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// copies the sub-string into a []byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;uuid&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;strings&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Clone&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;log&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#f6c177"&gt;36&lt;/span&gt;&lt;span style="color:#908caa"&gt;])&lt;/span&gt; &lt;span style="color:#6e6a86"&gt;// creates a new copy of the string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Thinking concurrency is always faster</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/thinking-concurrency-is-always-faster/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/thinking-concurrency-is-always-faster/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Assuming that a concurrent solution is always faster than a sequential one. If
the workload we are parallelizing is too small, the overhead of creating and
scheduling goroutines quickly becomes the bottle-neck.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Create a hybrid approach that only leverages goroutines when the elements being
processed exceeds some threshold.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>time.After and memory leaks</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/time-after-and-memory-leaks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/time-after-and-memory-leaks/</guid><description>&lt;p&gt;&lt;code&gt;time.After(time.Duration)&lt;/code&gt; is the concurrent alternative for
&lt;code&gt;time.Sleep(time.duration)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This would result in creating a new time.After instance that is not release
until the timer expires for every iteration of this loop/every message received.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;consumer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;select&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;event&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;After&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Hour&lt;/span&gt;&lt;span style="color:#908caa"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;This is better, but creating a new context every loop is still not great.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;consumer&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Event&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;cancel&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WithTimeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Background&lt;/span&gt;&lt;span style="color:#908caa"&gt;(),&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Hour&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;select&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;event&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;cancel&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;case&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Done&lt;/span&gt;&lt;span style="color:#908caa"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The more appropriate approach would be to use a timer.&lt;/p&gt;</description></item><item><title>Under-optimized string concatenation</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/under-optimized-string-concatenation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/under-optimized-string-concatenation/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This allocates a new string for each loop. This is due to a string being
immutable in Go.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;concat&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;values&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;value&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;values&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;concat&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;values&lt;/span&gt; &lt;span style="color:#908caa"&gt;[]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;total&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#6e6a86"&gt;// Get total number of bytes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;values&lt;/span&gt;&lt;span style="color:#908caa"&gt;);&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;total&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;values&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;sb&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;strings&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Builder&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;sb&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Grow&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;total&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;value&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;values&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sb&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;WriteString&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;value&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sb&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;String&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Unexpected side effects of using slice append</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/unexpected-side-effects-using-slice-append/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/unexpected-side-effects-using-slice-append/</guid><description>&lt;p&gt;When slicing another slice, the newly created slice will have a pointer
referencing the backing array of the original slice. This means that any
modifications to either slice will be reflected in both.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;When appending contents to either slice that will not fit inside the backing
array, a new backing array must be created. This breaks the relationship between
the two slices.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Create a copy of the original slice to avoid this behavior.&lt;/p&gt;</description></item><item><title>Unintended side effects with named result parameters</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/unintended-side-effects-with-named-result-parameters/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/unintended-side-effects-with-named-result-parameters/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Under normal circumstances, this code would not compile because we never set nor
initialize the &lt;code&gt;err&lt;/code&gt; variable. However, since it is a named result parameter the
err variable is initialized to it&amp;rsquo;s zero value and as a result &lt;code&gt;err&lt;/code&gt; always
returns nil.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;l&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;loc&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getCoordinates&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;address&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;lat&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;lng&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float32&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;isValid&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;l&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;validateAddress&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;address&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#908caa"&gt;!&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;isValid&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;invalid address&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Err&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Either avoid named result parameters or shadow the &lt;code&gt;err&lt;/code&gt; variable.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;l&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;loc&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;getCoordinates&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;context&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Context&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;address&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;lat&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;lng&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float32&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;isValid&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;l&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;validateAddress&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;address&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#908caa"&gt;!&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;isValid&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;invalid address&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ctx&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Err&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Unnecessary Nested Code</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/unnecessary-nested-code/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/unnecessary-nested-code/</guid><description>&lt;p&gt;Multiple layers of nested code can impact readability.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;In this case, the client looks as if it is being assigned, but it is just the
shadow variable that is being set.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;join&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s2&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;max&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s1&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;s1 is empty&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s2&lt;/span&gt; &lt;span style="color:#908caa"&gt;==&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;errors&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;New&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#f6c177"&gt;&amp;#34;s2 is empty&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#6e6a86"&gt;// Calls a concatenate function to perform some specific concatenation but may return errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#ea9a97"&gt;concat&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;concatenate&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;s1&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;s2&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;concat&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;max&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;					&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;concat&lt;/span&gt;&lt;span style="color:#908caa"&gt;[:&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;max&lt;/span&gt;&lt;span style="color:#908caa"&gt;],&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;					&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;concat&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Same functionality, but easier to follow&lt;/p&gt;</description></item><item><title>Useless string conversions</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/useless-string-conversions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/useless-string-conversions/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Converting strings to []byte slice when it doesn&amp;rsquo;t make sense. While strings are
human friendly, []byte slices is what most functions accept as a parameter.&lt;/p&gt;
&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Use []byte slice and the relevant transforms in the &lt;code&gt;bytes&lt;/code&gt; package.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Using a defer inside a loop</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-a-defer-inside-a-loop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-a-defer-inside-a-loop/</guid><description>&lt;p&gt;The &lt;code&gt;defer&lt;/code&gt; statement delays execution until the surrounding function exits.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;These files could potentially be kept open forever, causing a leak.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;readFiles&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;path&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#ea9a97"&gt;file&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;os&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Open&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;path&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#6e6a86"&gt;// This is deferred when readFiles exits, not the current iteration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;file&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Change the function scope&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;readFiles&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;chan&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;path&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;ch&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;readFile&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;path&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;readFile&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;path&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;file&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;os&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Open&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;path&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;defer&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;file&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Close&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Using a filename as a function input</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-a-filename-as-a-function-input/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-a-filename-as-a-function-input/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;Testing this function would require a unique file for every use case.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;countEmptyLinesInFile&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;filename&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;file&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;os&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Open&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;filename&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Handle file closure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;scanner&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;bufio&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;NewScanner&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;file&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;scanner&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Scan&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Extract the file i/o from the function logic.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;countEmptyLines&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;reader&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;io&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Reader&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;int&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;error&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;scanner&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;bufio&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;NewScanner&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;reader&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;scanner&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Scan&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Using mutexes inaccurately with slices and maps</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-mutexes-inaccurately-with-slice-and-maps/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-mutexes-inaccurately-with-slice-and-maps/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This creates a data race. Internally a map is a runtime.hmap struct containing
mostly metadata and a pointer referencing the actual data. The same holds true
for slices&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;type&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;struct&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sync&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RWMutex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;balances&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;map&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt;&lt;span style="color:#3e8fb0"&gt;float64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;AddBalance&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;string&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float64&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Lock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balances&lt;/span&gt;&lt;span style="color:#908caa"&gt;[&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;id&lt;/span&gt;&lt;span style="color:#908caa"&gt;]&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Unlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;c&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Cache&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;AverageBalance&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;float64&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RLock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// this does not copy the data, just a pointer to the data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;balances&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balances&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;c&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;mu&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;RUnlock&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;sum&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;_&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;range&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;balances&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;sum&lt;/span&gt; &lt;span style="color:#908caa"&gt;+=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;balance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;sum&lt;/span&gt; &lt;span style="color:#908caa"&gt;/&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;float64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;len&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;balances&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;Alternatively, we could make a deep copy of the map/slice by iterating over all
of it&amp;rsquo;s elements and inserting them into a new copy.&lt;/p&gt;</description></item><item><title>Using the default HTTP client and server</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-the-default-http-client-and-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/using-the-default-http-client-and-server/</guid><description>&lt;h2 id="client"&gt;Client&lt;/h2&gt;
&lt;h3 id="mistake"&gt;Mistake&lt;/h3&gt;
&lt;p&gt;This does not specify any timeouts&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;client&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix"&gt;Fix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;client&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Timeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;5&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Transport&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Transport&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;DialContext&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;net&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Dialer&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Timeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}).&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;DialContext&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;TLSHandshakeTimeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ResponseHeaderTimeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We should also consider that the clients are pooled and re-used. Balancing these
variables is critical for production facing systems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http.Transport.IdleConnTimeout (default 90s): this is how long idle
connections hang around before closed&lt;/li&gt;
&lt;li&gt;http.Transport.MaxIdleConns (default 100): the max idle connections&lt;/li&gt;
&lt;li&gt;http.Transport.MaxIdleConnsPerHost (default 2): max idle connections per host&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="server"&gt;Server&lt;/h2&gt;
&lt;h3 id="mistake-1"&gt;Mistake&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;server&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Server&lt;/span&gt;&lt;span style="color:#908caa"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;server&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Serve&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;listener&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fix-1"&gt;Fix&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ea9a97"&gt;server&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Server&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Addr&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ReadHeaderTimeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;500&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;ReadTimeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#f6c177"&gt;500&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Millisecond&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;Handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;TimeoutHandler&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;handler&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span style="color:#908caa"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;IdleTimeout&lt;/span&gt;&lt;span style="color:#908caa"&gt;:&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;time&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Second&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maladroit.dev/kb/reference/100-go-mistakes-and-how-to-avoid-them"&gt;100 Go Mistakes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Variable shadowing</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/variable-shadowing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/variable-shadowing/</guid><description>&lt;p&gt;Variable shadowing is re-declaring a variable in an inner block and can result
in unexpected outcomes.&lt;/p&gt;
&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;In this case, the client looks as if it is being assigned, but it is just the
shadow variable that is being set.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;client&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;http&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;Client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;tracing&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Shadowed client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;client&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewTracingClient&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;else&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6e6a86"&gt;// Shadowed client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ea9a97"&gt;client&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;NewClient&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#3e8fb0"&gt;if&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt; &lt;span style="color:#908caa"&gt;!=&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;nil&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;err&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6e6a86"&gt;// Client is still nil at this point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fix"&gt;Fix&lt;/h2&gt;
&lt;p&gt;In this case, a temporary variable is being declared and then is assigned to the
client&lt;/p&gt;</description></item><item><title>Writing concurrent code that leads to false sharing</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/writing-concurrent-code-that-leads-to-false-sharing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/writing-concurrent-code-that-leads-to-false-sharing/</guid><description>&lt;h2 id="mistake"&gt;Mistake&lt;/h2&gt;
&lt;p&gt;This example works from a concurrency perspective, but it is in example of false
sharing and can result in poor performance. Since &lt;code&gt;sumA&lt;/code&gt; and &lt;code&gt;sumB&lt;/code&gt; are
allocated contiguously, they more than likely will be placed on the same block.
When the these goroutines end up getting scheduled to different cores, the CPU
will need to copy this block of memory twice. Due to cache coherency, even
though each goroutine is only modifying it&amp;rsquo;s respective &lt;code&gt;sum&lt;/code&gt;, the CPU only
tracks the cache line.&lt;/p&gt;</description></item><item><title>Writing inaccurate benchmarks</title><link>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/writing-inaccurate-benchmarks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://maladroit.dev/kb/computer-engineering/100-go-mistakes/writing-inaccurate-benchmarks/</guid><description>&lt;h2 id="not-resetting-or-pausing-the-timer"&gt;Not resetting or pausing the timer&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;BenchmarkFoo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;B&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;setup&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;ResetTimer&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;N&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;BenchmarkFoo&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;B&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;N&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StopTimer&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;setup&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StartTimer&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;foo&lt;/span&gt;&lt;span style="color:#908caa"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="micro-benchmarks"&gt;Micro-benchmarks&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;BenchmarkAtomicStoreInt32&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;B&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;N&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt;&lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;atomic&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StoreInt32&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;BenchmarkAtomicStoreInt64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;b&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;testing&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;B&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;var&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;v&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;int64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;for&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;:=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;b&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;N&lt;/span&gt;&lt;span style="color:#908caa"&gt;;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;i&lt;/span&gt;&lt;span style="color:#908caa"&gt;++&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;atomic&lt;/span&gt;&lt;span style="color:#908caa"&gt;.&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;StoreInt64&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;v&lt;/span&gt;&lt;span style="color:#908caa"&gt;,&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run the benchmark multiple times and evaluate statistics using &lt;code&gt;benchstat&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go &lt;span style="color:#ea9a97"&gt;test&lt;/span&gt; -bench&lt;span style="color:#908caa"&gt;=&lt;/span&gt;. -count&lt;span style="color:#908caa"&gt;=&lt;/span&gt;&lt;span style="color:#f6c177"&gt;10&lt;/span&gt; &lt;span style="color:#908caa"&gt;|&lt;/span&gt; stats.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;benchstat stats.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="compiler-optimizations"&gt;Compiler optimizations&lt;/h2&gt;
&lt;p&gt;This function is likely to be in-lined, making the benchmark useless&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e0def4;background-color:#232136;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;const&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m1&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0x5555555555555555&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;const&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m2&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0x3333333333333333&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;const&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m4&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0x0f0f0f0f0f0f0f0f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;const&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;h01&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#f6c177"&gt;0x0101010101010101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#3e8fb0"&gt;func&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;popcnt&lt;/span&gt;&lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;uint64&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#3e8fb0"&gt;uint64&lt;/span&gt; &lt;span style="color:#908caa"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;-=&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;1&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m2&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;+&lt;/span&gt; &lt;span style="color:#908caa"&gt;((&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;2&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m2&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;=&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;+&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;4&lt;/span&gt;&lt;span style="color:#908caa"&gt;))&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;m4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#3e8fb0"&gt;return&lt;/span&gt; &lt;span style="color:#908caa"&gt;(&lt;/span&gt;&lt;span style="color:#ea9a97"&gt;x&lt;/span&gt; &lt;span style="color:#908caa"&gt;*&lt;/span&gt; &lt;span style="color:#ea9a97"&gt;h01&lt;/span&gt;&lt;span style="color:#908caa"&gt;)&lt;/span&gt; &lt;span style="color:#908caa"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f6c177"&gt;56&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#908caa"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can avoid in-lining by forcing the function to write to a local variable and
then write to a variable outside of the function scope.&lt;/p&gt;</description></item></channel></rss>