<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on Moises Vega</title><link>https://mvega.dev/posts/</link><description>Recent content in Posts on Moises Vega</description><generator>Hugo</generator><language>en-us</language><copyright>Moises Vega</copyright><lastBuildDate>Thu, 03 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mvega.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>When THP always Undoes the Go Scavenger's Work</title><link>https://mvega.dev/posts/go-scavenger-thp-oom/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/go-scavenger-thp-oom/</guid><description>&lt;p&gt;A fleet of Go services kept getting OOM-killed inside containers whose
memory limits were generous — two to three times the live heap the
runtime reported. We had &lt;code&gt;GODEBUG=madvdontneed=1&lt;/code&gt; set from years back,
so I expected RSS to track the heap closely. Instead RSS climbed in a
sawtooth that never came back down, while &lt;code&gt;runtime.MemStats.HeapReleased&lt;/code&gt;
insisted the memory had been handed back to the kernel.&lt;/p&gt;
&lt;p&gt;Both were telling the truth. The host had
&lt;code&gt;/sys/kernel/mm/transparent_hugepage/enabled&lt;/code&gt; set to &lt;code&gt;always&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>When Request.Body.Close Started Returning io.EOF</title><link>https://mvega.dev/posts/go-http-body-close-eof/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/go-http-body-close-eof/</guid><description>&lt;p&gt;While testing an internal HTTP service against Go 1.27, a handler that
had worked for years started reporting errors from an unlikely place:
&lt;code&gt;r.Body.Close()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The handler does what any length-aware decoder does — it reads exactly
the payload it expects and stops, without reading far enough to observe
&lt;code&gt;io.EOF&lt;/code&gt;. Then it closes the body. On Go 1.26 that &lt;code&gt;Close&lt;/code&gt; returned
&lt;code&gt;nil&lt;/code&gt;. On 1.27 it returns &lt;code&gt;io.EOF&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="pinning-it-down"&gt;Pinning it down&lt;/h2&gt;
&lt;p&gt;Timer-driven HTTP repros are flaky, so I drove &lt;code&gt;net/http&lt;/code&gt; over a
&lt;code&gt;net.Pipe&lt;/code&gt; with a one-shot listener: fully deterministic, no real
sockets, no timeouts. The whole thing fits in a
&lt;a href="https://go.dev/play/p/P6gM5GS84Vq"&gt;playground link&lt;/a&gt;. A handler reads 2
of 4 body bytes, closes, and reports the error:&lt;/p&gt;</description></item><item><title>Testing Concurrent Go with synctest</title><link>https://mvega.dev/posts/synctest-concurrent-testing/</link><pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/synctest-concurrent-testing/</guid><description>&lt;p&gt;Notes from Alexander Baygeldin&amp;rsquo;s GopherCon 2026 talk, &amp;ldquo;(Sync)testing
Concurrent Code with Confidence.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Testing concurrent code used to mean picking one of three bad options:
hacky (poke at internals), flaky (&lt;code&gt;time.Sleep(100 * time.Millisecond)&lt;/code&gt;
and hope), or slow (sleep long enough that it&amp;rsquo;s reliable). &lt;code&gt;testing/synctest&lt;/code&gt;
removes the tradeoff by giving the test a fake clock.&lt;/p&gt;
&lt;h2 id="the-fake-clock"&gt;The fake clock&lt;/h2&gt;
&lt;p&gt;Inside &lt;code&gt;synctest.Test&lt;/code&gt;, time doesn&amp;rsquo;t pass on its own. It jumps forward
only when every goroutine in the bubble is blocked. A one-hour timeout
resolves instantly and deterministically.&lt;/p&gt;</description></item><item><title>Why Go's Generics Rules Keep Loosening</title><link>https://mvega.dev/posts/go-generics-loosening/</link><pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/go-generics-loosening/</guid><description>&lt;p&gt;Notes from Naoki Kuroda&amp;rsquo;s GopherCon 2026 talk, &amp;ldquo;Loosening the Reins: Go
Generics Get More Flexible.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The talk starts from one line in the Go 1.26 release notes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Ordered&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Ordered&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;]] &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; { &lt;span style="color:#f92672"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A constraint that refers to itself. Go 1.25 rejected it as an invalid
recursive type; Go 1.26 accepts it. Kuroda went through the spec
history, issues, and the &lt;code&gt;go/types&lt;/code&gt; checker to find out what changed —
and the answer wasn&amp;rsquo;t &amp;ldquo;we found a clever fix.&amp;rdquo; The original rule had
simply been drawn wider than the problem it was guarding against.&lt;/p&gt;</description></item><item><title>Building Agentic Systems in Go with Ollama</title><link>https://mvega.dev/posts/go-agents-ollama/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/go-agents-ollama/</guid><description>&lt;p&gt;I worked through Joel Boursiquot&amp;rsquo;s GopherCon 2026 workshop, &lt;a href="https://github.com/jboursiquot/gc26buildingagenticsystems"&gt;Agentic
Systems the Hard Way&lt;/a&gt;.
Zero third-party dependencies. The framing that stuck: Go is the control
plane; the LLM is the decision engine. Here&amp;rsquo;s the core of it.&lt;/p&gt;
&lt;h2 id="what-an-agent-actually-is"&gt;What an agent actually is&lt;/h2&gt;
&lt;p&gt;Model + tools + loop. The model never executes anything — it emits a
wish (&amp;ldquo;call &lt;code&gt;search_docs&lt;/code&gt; with these args&amp;rdquo;), your Go code validates and
runs it, feeds the result back, and repeats until the model answers
without asking for tools. Deterministic Go around a nondeterministic
model. That&amp;rsquo;s the whole trick.&lt;/p&gt;</description></item><item><title>Local LLM Inference in Go with Kronk</title><link>https://mvega.dev/posts/kronk-local-inference/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/kronk-local-inference/</guid><description>&lt;p&gt;I&amp;rsquo;ve been running local models through Ollama&amp;rsquo;s HTTP API for a while. It works, but it means a separate daemon, JSON over localhost, and no control over when models load or unload. &lt;a href="https://github.com/ardanlabs/kronk"&gt;Kronk&lt;/a&gt;, from Ardan Labs, takes the other route: it&amp;rsquo;s a Go SDK that binds llama.cpp (and whisper.cpp, via Bucky) directly into your process. No Python, no sidecar server. The model lives in your binary&amp;rsquo;s memory and you drive it with Go calls.&lt;/p&gt;</description></item><item><title>Go 1.27: The Highlights</title><link>https://mvega.dev/posts/go-1-27/</link><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/go-1-27/</guid><description>&lt;p&gt;Go 1.27 lands this month. The &lt;a href="https://go.dev/doc/go1.27"&gt;release notes&lt;/a&gt;
are long; these are the changes I actually care about.&lt;/p&gt;
&lt;h2 id="generic-methods"&gt;Generic methods&lt;/h2&gt;
&lt;p&gt;The headline: methods can finally declare their own type parameters.
Helpers that used to be package-scoped functions can now live on the
type they belong to.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;E&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;comparable&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt;{ &lt;span style="color:#a6e22e"&gt;m&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;E&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;struct&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:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;E&lt;/span&gt;]) &lt;span style="color:#a6e22e"&gt;Map&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;comparable&lt;/span&gt;](&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;E&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;out&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;]{&lt;span style="color:#a6e22e"&gt;m&lt;/span&gt;: make(&lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt;{}, len(&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;m&lt;/span&gt;))}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;e&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;m&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;m&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;)] = &lt;span style="color:#66d9ef"&gt;struct&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:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;out&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One catch: interface methods cannot declare type parameters, so you
cannot abstract over generic methods with an interface.&lt;/p&gt;</description></item><item><title>Signing Git Commits with SSH Keys</title><link>https://mvega.dev/posts/ssh-commit-signing/</link><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/ssh-commit-signing/</guid><description>&lt;p&gt;Git identity is self-declared. &lt;code&gt;user.email&lt;/code&gt; is a config value, not a
credential — anyone can set it to your address, commit, and push
wherever they have write access. GitHub renders your avatar on the
result. Nothing in the process verifies that you wrote anything.&lt;/p&gt;
&lt;p&gt;Commit signing fixes that, and since Git 2.34 you can do it with the
SSH key you already push with. No GPG keyring, no key servers, no
expiry dance.&lt;/p&gt;</description></item><item><title>Managing Dotfiles with GNU Stow</title><link>https://mvega.dev/posts/dotfiles-with-stow/</link><pubDate>Thu, 13 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/dotfiles-with-stow/</guid><description>&lt;p&gt;Dotfile setups tend to start as a repo full of files plus a shell script
that copies them into &lt;code&gt;$HOME&lt;/code&gt;. The copies drift from the repo, the
script grows special cases, and eventually nobody is sure which version
is real.&lt;/p&gt;
&lt;p&gt;GNU Stow removes the copy step. One directory per tool, and &lt;code&gt;stow &amp;lt;tool&amp;gt;&lt;/code&gt;
symlinks its contents into the parent directory. Editing the repo edits
the live config, because they are the same file.&lt;/p&gt;</description></item><item><title>Table-Driven Tests in Go</title><link>https://mvega.dev/posts/table-driven-tests/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://mvega.dev/posts/table-driven-tests/</guid><description>&lt;p&gt;Every Go codebase converges on the same test shape: a slice of cases, a
loop, one &lt;code&gt;t.Run&lt;/code&gt; per case. It is the closest thing Go has to a testing
idiom, and it is worth writing deliberately rather than by habit.&lt;/p&gt;
&lt;h2 id="the-shape"&gt;The shape&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-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:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestParseDuration&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;testing&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tests&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;give&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;want&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Duration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wantErr&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;seconds&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;give&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;30s&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;want&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Second&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;compound&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;give&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1h30m&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;want&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Minute&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;missing unit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;give&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;30&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wantErr&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;missing unit&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&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:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;tt&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tests&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Run&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;testing&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;got&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ParseDuration&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;give&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wantErr&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#e6db74"&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:#a6e22e"&gt;require&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ErrorContains&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;tt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wantErr&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&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:#a6e22e"&gt;require&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NoError&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;assert&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Equal&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;tt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;want&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;got&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Three things earn their place here.&lt;/p&gt;</description></item></channel></rss>