diff options
author | Akshay <[email protected]> | 2023-02-12 06:43:49 +0000 |
---|---|---|
committer | Akshay <[email protected]> | 2023-02-12 06:43:49 +0000 |
commit | 366df8852f503523cc4f9046d82ba9a99dd51d7f (patch) | |
tree | 635884dd5700cdc2a22a8885031aa67816bbe1b0 /docs/posts/gripes_with_go | |
parent | 57a1fc656e05e1fcf07e4cff3dc988c6b5c2bc59 (diff) |
new art: lapse
Diffstat (limited to 'docs/posts/gripes_with_go')
-rw-r--r-- | docs/posts/gripes_with_go/index.html | 85 |
1 files changed, 59 insertions, 26 deletions
diff --git a/docs/posts/gripes_with_go/index.html b/docs/posts/gripes_with_go/index.html index 1551fe6..74d6995 100644 --- a/docs/posts/gripes_with_go/index.html +++ b/docs/posts/gripes_with_go/index.html | |||
@@ -28,7 +28,7 @@ | |||
28 | 01/08 — 2020 | 28 | 01/08 — 2020 |
29 | <div class="stats"> | 29 | <div class="stats"> |
30 | <span class="stats-number"> | 30 | <span class="stats-number"> |
31 | 76.71 | 31 | 76.72 |
32 | </span> | 32 | </span> |
33 | <span class="stats-unit">cm</span> | 33 | <span class="stats-unit">cm</span> |
34 |   | 34 |   |
@@ -42,17 +42,24 @@ | |||
42 | Gripes With Go | 42 | Gripes With Go |
43 | </h1> | 43 | </h1> |
44 | <div class="post-text"> | 44 | <div class="post-text"> |
45 | <p>You’ve read a lot of posts about the shortcomings of the Go programming language, so what’s one more.</p> | 45 | <p>You’ve read a lot of posts about the shortcomings of the Go |
46 | programming language, so what’s one more.</p> | ||
46 | <ol type="1"> | 47 | <ol type="1"> |
47 | <li><a href="#lack-of-sum-types">Lack of sum types</a></li> | 48 | <li><a href="#lack-of-sum-types">Lack of sum types</a></li> |
48 | <li><a href="#type-assertions">Type assertions</a></li> | 49 | <li><a href="#type-assertions">Type assertions</a></li> |
49 | <li><a href="#date-and-time">Date and Time</a></li> | 50 | <li><a href="#date-and-time">Date and Time</a></li> |
50 | <li><a href="#statements-over-expressions">Statements over Expressions</a></li> | 51 | <li><a href="#statements-over-expressions">Statements over |
51 | <li><a href="#erroring-out-on-unused-variables">Erroring out on unused variables</a></li> | 52 | Expressions</a></li> |
53 | <li><a href="#erroring-out-on-unused-variables">Erroring out on unused | ||
54 | variables</a></li> | ||
52 | <li><a href="#error-handling">Error handling</a></li> | 55 | <li><a href="#error-handling">Error handling</a></li> |
53 | </ol> | 56 | </ol> |
54 | <h3 id="lack-of-sum-types">Lack of Sum types</h3> | 57 | <h3 id="lack-of-sum-types">Lack of Sum types</h3> |
55 | <p>A “Sum” type is a data type that can hold one of many states at a given time, similar to how a boolean can hold a true or a false, not too different from an <code>enum</code> type in C. Go lacks <code>enum</code> types unfortunately, and you are forced to resort to crafting your own substitute.</p> | 58 | <p>A “Sum” type is a data type that can hold one of many states at a |
59 | given time, similar to how a boolean can hold a true or a false, not too | ||
60 | different from an <code>enum</code> type in C. Go lacks | ||
61 | <code>enum</code> types unfortunately, and you are forced to resort to | ||
62 | crafting your own substitute.</p> | ||
56 | <p>A type to represent gender for example:</p> | 63 | <p>A type to represent gender for example:</p> |
57 | <div class="sourceCode" id="cb1"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">type</span> Gender <span class="dt">int</span></span> | 64 | <div class="sourceCode" id="cb1"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">type</span> Gender <span class="dt">int</span></span> |
58 | <span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span> | 65 | <span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span> |
@@ -67,17 +74,18 @@ | |||
67 | <span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="co">// Oops! We have to implement String() for Gender ...</span></span> | 74 | <span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="co">// Oops! We have to implement String() for Gender ...</span></span> |
68 | <span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a></span> | 75 | <span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a></span> |
69 | <span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a><span class="kw">func</span> <span class="op">(</span>g Gender<span class="op">)</span> String<span class="op">()</span> <span class="dt">string</span> <span class="op">{</span></span> | 76 | <span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a><span class="kw">func</span> <span class="op">(</span>g Gender<span class="op">)</span> String<span class="op">()</span> <span class="dt">string</span> <span class="op">{</span></span> |
70 | <span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> <span class="kw">switch</span> <span class="op">(</span>g<span class="op">)</span> <span class="op">{</span></span> | 77 | <span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> <span class="cf">switch</span> <span class="op">(</span>g<span class="op">)</span> <span class="op">{</span></span> |
71 | <span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> <span class="kw">case</span> <span class="dv">0</span><span class="op">:</span> <span class="kw">return</span> <span class="st">"Male"</span></span> | 78 | <span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> <span class="cf">case</span> <span class="dv">0</span><span class="op">:</span> <span class="cf">return</span> <span class="st">"Male"</span></span> |
72 | <span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> <span class="kw">case</span> <span class="dv">1</span><span class="op">:</span> <span class="kw">return</span> <span class="st">"Female"</span></span> | 79 | <span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> <span class="cf">case</span> <span class="dv">1</span><span class="op">:</span> <span class="cf">return</span> <span class="st">"Female"</span></span> |
73 | <span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a> <span class="kw">default</span><span class="op">:</span> <span class="kw">return</span> <span class="st">"Other"</span></span> | 80 | <span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a> <span class="cf">default</span><span class="op">:</span> <span class="cf">return</span> <span class="st">"Other"</span></span> |
74 | <span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span> | 81 | <span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span> |
75 | <span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span> | 82 | <span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span> |
76 | <span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a></span> | 83 | <span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a></span> |
77 | <span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a><span class="co">// You can accidentally do stupid stuff like:</span></span> | 84 | <span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a><span class="co">// You can accidentally do stupid stuff like:</span></span> |
78 | <span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a>gender <span class="op">:=</span> Male <span class="op">+</span> <span class="dv">1</span></span></code></pre></div> | 85 | <span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a>gender <span class="op">:=</span> Male <span class="op">+</span> <span class="dv">1</span></span></code></pre></div> |
79 | <p>The Haskell equivalent of the same:</p> | 86 | <p>The Haskell equivalent of the same:</p> |
80 | <div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">data</span> <span class="dt">Gender</span> <span class="ot">=</span> <span class="dt">Male</span></span> | 87 | <div class="sourceCode" id="cb2"><pre |
88 | class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">data</span> <span class="dt">Gender</span> <span class="ot">=</span> <span class="dt">Male</span></span> | ||
81 | <span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="op">|</span> <span class="dt">Female</span></span> | 89 | <span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="op">|</span> <span class="dt">Female</span></span> |
82 | <span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="op">|</span> <span class="dt">Other</span></span> | 90 | <span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="op">|</span> <span class="dt">Other</span></span> |
83 | <span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="kw">deriving</span> (<span class="dt">Show</span>)</span> | 91 | <span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="kw">deriving</span> (<span class="dt">Show</span>)</span> |
@@ -88,7 +96,7 @@ | |||
88 | <p>Type assertions in Go allow you to do:</p> | 96 | <p>Type assertions in Go allow you to do:</p> |
89 | <div class="sourceCode" id="cb3"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span> x <span class="kw">interface</span><span class="op">{}</span> <span class="op">=</span> <span class="dv">7</span></span> | 97 | <div class="sourceCode" id="cb3"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span> x <span class="kw">interface</span><span class="op">{}</span> <span class="op">=</span> <span class="dv">7</span></span> |
90 | <span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>y<span class="op">,</span> goodToGo <span class="op">:=</span> x<span class="op">.(</span><span class="dt">int</span><span class="op">)</span></span> | 98 | <span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>y<span class="op">,</span> goodToGo <span class="op">:=</span> x<span class="op">.(</span><span class="dt">int</span><span class="op">)</span></span> |
91 | <span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="kw">if</span> goodToGo <span class="op">{</span></span> | 99 | <span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> goodToGo <span class="op">{</span></span> |
92 | <span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a> fmt<span class="op">.</span>Println<span class="op">(</span>y<span class="op">)</span></span> | 100 | <span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a> fmt<span class="op">.</span>Println<span class="op">(</span>y<span class="op">)</span></span> |
93 | <span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div> | 101 | <span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div> |
94 | <p>The error check however is optional:</p> | 102 | <p>The error check however is optional:</p> |
@@ -98,18 +106,32 @@ | |||
98 | <span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="co">// results in a runtime error:</span></span> | 106 | <span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="co">// results in a runtime error:</span></span> |
99 | <span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="co">// panic: interface conversion: interface {} is int, not float64</span></span></code></pre></div> | 107 | <span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="co">// panic: interface conversion: interface {} is int, not float64</span></span></code></pre></div> |
100 | <h3 id="date-and-time">Date and Time</h3> | 108 | <h3 id="date-and-time">Date and Time</h3> |
101 | <p>Anyone that has written Go previously, will probably already know what I am getting at here. For the uninitiated, parsing and formatting dates in Go requires a “layout”. This “layout” is based on magical reference date:</p> | 109 | <p>Anyone that has written Go previously, will probably already know |
110 | what I am getting at here. For the uninitiated, parsing and formatting | ||
111 | dates in Go requires a “layout”. This “layout” is based on magical | ||
112 | reference date:</p> | ||
102 | <pre><code>Mon Jan 2 15:04:05 MST 2006</code></pre> | 113 | <pre><code>Mon Jan 2 15:04:05 MST 2006</code></pre> |
103 | <p>Which is the date produced when you write the first seven natural numbers like so:</p> | 114 | <p>Which is the date produced when you write the first seven natural |
115 | numbers like so:</p> | ||
104 | <pre><code>01/02 03:04:05 '06 -0700</code></pre> | 116 | <pre><code>01/02 03:04:05 '06 -0700</code></pre> |
105 | <p>Parsing a string in <code>YYYY-MM-DD</code> format would look something like:</p> | 117 | <p>Parsing a string in <code>YYYY-MM-DD</code> format would look |
118 | something like:</p> | ||
106 | <div class="sourceCode" id="cb7"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="kw">const</span> layout <span class="op">=</span> <span class="st">"2006-01-02"</span></span> | 119 | <div class="sourceCode" id="cb7"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="kw">const</span> layout <span class="op">=</span> <span class="st">"2006-01-02"</span></span> |
107 | <span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>time<span class="op">.</span>Parse<span class="op">(</span>layout<span class="op">,</span> <span class="st">"2020-08-01"</span><span class="op">)</span></span></code></pre></div> | 120 | <span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>time<span class="op">.</span>Parse<span class="op">(</span>layout<span class="op">,</span> <span class="st">"2020-08-01"</span><span class="op">)</span></span></code></pre></div> |
108 | <p>This so-called “intuitive” method of formatting dates doesn’t allow you to print <code>0000 hrs</code> as <code>2400 hrs</code>, it doesn’t allow you to omit the leading zero in 24 hour formats. It is rife with inconveniences, if only there were a <a href="https://man7.org/linux/man-pages/man3/strftime.3.html">tried and tested</a> date formatting convention …</p> | 121 | <p>This so-called “intuitive” method of formatting dates doesn’t allow |
122 | you to print <code>0000 hrs</code> as <code>2400 hrs</code>, it doesn’t | ||
123 | allow you to omit the leading zero in 24 hour formats. It is rife with | ||
124 | inconveniences, if only there were a <a | ||
125 | href="https://man7.org/linux/man-pages/man3/strftime.3.html">tried and | ||
126 | tested</a> date formatting convention …</p> | ||
109 | <h3 id="statements-over-expressions">Statements over Expressions</h3> | 127 | <h3 id="statements-over-expressions">Statements over Expressions</h3> |
110 | <p>Statements have side effects, expressions return values. More often than not, expressions are easier to understand at a glance: evaluate the LHS and assign the same to the RHS.</p> | 128 | <p>Statements have side effects, expressions return values. More often |
111 | <p>Rust allows you to create local namespaces, and treats blocks (<code>{}</code>) as expressions:</p> | 129 | than not, expressions are easier to understand at a glance: evaluate the |
112 | <div class="sourceCode" id="cb8"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="kw">let</span> twenty_seven <span class="op">=</span> <span class="op">{</span></span> | 130 | LHS and assign the same to the RHS.</p> |
131 | <p>Rust allows you to create local namespaces, and treats blocks | ||
132 | (<code>{}</code>) as expressions:</p> | ||
133 | <div class="sourceCode" id="cb8"><pre | ||
134 | class="sourceCode rust"><code class="sourceCode rust"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="kw">let</span> twenty_seven <span class="op">=</span> <span class="op">{</span></span> | ||
113 | <span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> three <span class="op">=</span> <span class="dv">1</span> <span class="op">+</span> <span class="dv">2</span><span class="op">;</span></span> | 135 | <span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> three <span class="op">=</span> <span class="dv">1</span> <span class="op">+</span> <span class="dv">2</span><span class="op">;</span></span> |
114 | <span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> nine <span class="op">=</span> three <span class="op">*</span> three<span class="op">;</span></span> | 136 | <span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> nine <span class="op">=</span> three <span class="op">*</span> three<span class="op">;</span></span> |
115 | <span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a> nine <span class="op">*</span> three</span> | 137 | <span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a> nine <span class="op">*</span> three</span> |
@@ -120,17 +142,25 @@ | |||
120 | <span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a>three <span class="op">:=</span> <span class="dv">1</span> <span class="op">+</span> <span class="dv">2</span></span> | 142 | <span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a>three <span class="op">:=</span> <span class="dv">1</span> <span class="op">+</span> <span class="dv">2</span></span> |
121 | <span id="cb9-4"><a href="#cb9-4" aria-hidden="true" tabindex="-1"></a>nine <span class="op">:=</span> three <span class="op">*</span> three</span> | 143 | <span id="cb9-4"><a href="#cb9-4" aria-hidden="true" tabindex="-1"></a>nine <span class="op">:=</span> three <span class="op">*</span> three</span> |
122 | <span id="cb9-5"><a href="#cb9-5" aria-hidden="true" tabindex="-1"></a>twenty_seven <span class="op">=</span> nine <span class="op">*</span> three</span></code></pre></div> | 144 | <span id="cb9-5"><a href="#cb9-5" aria-hidden="true" tabindex="-1"></a>twenty_seven <span class="op">=</span> nine <span class="op">*</span> three</span></code></pre></div> |
123 | <h3 id="erroring-out-on-unused-variables">Erroring out on unused variables</h3> | 145 | <h3 id="erroring-out-on-unused-variables">Erroring out on unused |
124 | <p>Want to quickly prototype something? Go says no! In all seriousness, a warning would suffice, I don’t want to have to go back and comment each unused import out, only to come back and uncomment them a few seconds later.</p> | 146 | variables</h3> |
147 | <p>Want to quickly prototype something? Go says no! In all seriousness, | ||
148 | a warning would suffice, I don’t want to have to go back and comment | ||
149 | each unused import out, only to come back and uncomment them a few | ||
150 | seconds later.</p> | ||
125 | <h3 id="error-handling">Error handling</h3> | 151 | <h3 id="error-handling">Error handling</h3> |
126 | <div class="sourceCode" id="cb10"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="kw">if</span> err <span class="op">!=</span> <span class="ot">nil</span> <span class="op">{</span> <span class="op">...</span> <span class="op">}</span></span></code></pre></div> | 152 | <div class="sourceCode" id="cb10"><pre |
153 | class="sourceCode go"><code class="sourceCode go"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> err <span class="op">!=</span> <span class="ot">nil</span> <span class="op">{</span> <span class="op">...</span> <span class="op">}</span></span></code></pre></div> | ||
127 | <p>Need I say more? I will, for good measure:</p> | 154 | <p>Need I say more? I will, for good measure:</p> |
128 | <ol type="1"> | 155 | <ol type="1"> |
129 | <li>Error handling is optional</li> | 156 | <li>Error handling is optional</li> |
130 | <li>Errors are propagated via a clunky <code>if</code> + <code>return</code> statement</li> | 157 | <li>Errors are propagated via a clunky <code>if</code> + |
158 | <code>return</code> statement</li> | ||
131 | </ol> | 159 | </ol> |
132 | <p>I prefer Haskell’s “Monadic” error handling, which is employed by Rust as well:</p> | 160 | <p>I prefer Haskell’s “Monadic” error handling, which is employed by |
133 | <div class="sourceCode" id="cb11"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="co">// 1. error handling is compulsory</span></span> | 161 | Rust as well:</p> |
162 | <div class="sourceCode" id="cb11"><pre | ||
163 | class="sourceCode rust"><code class="sourceCode rust"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="co">// 1. error handling is compulsory</span></span> | ||
134 | <span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="co">// 2. errors are propagated with the `?` operator</span></span> | 164 | <span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a><span class="co">// 2. errors are propagated with the `?` operator</span></span> |
135 | <span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a><span class="kw">fn</span> foo() <span class="op">-></span> <span class="dt">Result</span><span class="op"><</span><span class="dt">String</span><span class="op">,</span> <span class="pp">io::</span><span class="bu">Error</span><span class="op">></span> <span class="op">{</span></span> | 165 | <span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a><span class="kw">fn</span> foo() <span class="op">-></span> <span class="dt">Result</span><span class="op"><</span><span class="dt">String</span><span class="op">,</span> <span class="pp">io::</span><span class="bu">Error</span><span class="op">></span> <span class="op">{</span></span> |
136 | <span id="cb11-4"><a href="#cb11-4" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> <span class="kw">mut</span> f <span class="op">=</span> <span class="pp">File::</span>open(<span class="st">"foo.txt"</span>)<span class="op">?;</span> <span class="co">// return if error</span></span> | 166 | <span id="cb11-4"><a href="#cb11-4" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> <span class="kw">mut</span> f <span class="op">=</span> <span class="pp">File::</span>open(<span class="st">"foo.txt"</span>)<span class="op">?;</span> <span class="co">// return if error</span></span> |
@@ -144,13 +174,16 @@ | |||
144 | <span id="cb11-12"><a href="#cb11-12" aria-hidden="true" tabindex="-1"></a><span class="kw">fn</span> main() <span class="op">{</span></span> | 174 | <span id="cb11-12"><a href="#cb11-12" aria-hidden="true" tabindex="-1"></a><span class="kw">fn</span> main() <span class="op">{</span></span> |
145 | <span id="cb11-13"><a href="#cb11-13" aria-hidden="true" tabindex="-1"></a> <span class="co">// `contents` is an enum known as Result:</span></span> | 175 | <span id="cb11-13"><a href="#cb11-13" aria-hidden="true" tabindex="-1"></a> <span class="co">// `contents` is an enum known as Result:</span></span> |
146 | <span id="cb11-14"><a href="#cb11-14" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> contents <span class="op">=</span> foo()<span class="op">;</span></span> | 176 | <span id="cb11-14"><a href="#cb11-14" aria-hidden="true" tabindex="-1"></a> <span class="kw">let</span> contents <span class="op">=</span> foo()<span class="op">;</span></span> |
147 | <span id="cb11-15"><a href="#cb11-15" aria-hidden="true" tabindex="-1"></a> <span class="kw">match</span> contents <span class="op">{</span></span> | 177 | <span id="cb11-15"><a href="#cb11-15" aria-hidden="true" tabindex="-1"></a> <span class="cf">match</span> contents <span class="op">{</span></span> |
148 | <span id="cb11-16"><a href="#cb11-16" aria-hidden="true" tabindex="-1"></a> <span class="cn">Ok</span>(c) <span class="op">=></span> <span class="pp">println!</span>(c)<span class="op">,</span></span> | 178 | <span id="cb11-16"><a href="#cb11-16" aria-hidden="true" tabindex="-1"></a> <span class="cn">Ok</span>(c) <span class="op">=></span> <span class="pp">println!</span>(c)<span class="op">,</span></span> |
149 | <span id="cb11-17"><a href="#cb11-17" aria-hidden="true" tabindex="-1"></a> <span class="cn">Err</span>(e) <span class="op">=></span> <span class="pp">eprintln!</span>(e)</span> | 179 | <span id="cb11-17"><a href="#cb11-17" aria-hidden="true" tabindex="-1"></a> <span class="cn">Err</span>(e) <span class="op">=></span> <span class="pp">eprintln!</span>(e)</span> |
150 | <span id="cb11-18"><a href="#cb11-18" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span> | 180 | <span id="cb11-18"><a href="#cb11-18" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span> |
151 | <span id="cb11-19"><a href="#cb11-19" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div> | 181 | <span id="cb11-19"><a href="#cb11-19" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div> |
152 | <h3 id="conclusion">Conclusion</h3> | 182 | <h3 id="conclusion">Conclusion</h3> |
153 | <p>I did not want to conclude without talking about stylistic choices, lack of metaprogramming, bizzare export rules, but, I am too busy converting my <code>interface{}</code> types into actual generic code for Go v2.</p> | 183 | <p>I did not want to conclude without talking about stylistic choices, |
184 | lack of metaprogramming, bizzare export rules, but, I am too busy | ||
185 | converting my <code>interface{}</code> types into actual generic code | ||
186 | for Go v2.</p> | ||
154 | 187 | ||
155 | </div> | 188 | </div> |
156 | 189 | ||