daily
parent
e2681e1928
commit
2f7989429c
|
@ -224,9 +224,9 @@ internal
|
|||
<a href="https://go.dev/play/p/0XnOLiHuoz3" rel="nofollow">Example</a>:
|
||||
</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">func</span> <span class="pl-en">main</span>() {
|
||||
<span class="pl-s1">s</span> <span class="pl-c1">:=</span> <span class="pl-en">NewS</span>(<span class="pl-en">WithA</span>(<span class="pl-c1">1</span>), <span class="pl-en">WithB</span>(<span class="pl-s">"b"</span>))
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Printf</span>(<span class="pl-s">"%+v<span class="pl-cce">\n</span>"</span>, <span class="pl-s1">s</span>)
|
||||
<pre><span class="pl-k">func</span> <span class="pl-s1">main</span>() {
|
||||
<span class="pl-s1">s</span> <span class="pl-c1">:=</span> <span class="pl-s1">NewS</span>(<span class="pl-s1">WithA</span>(<span class="pl-c1">1</span>), <span class="pl-s1">WithB</span>(<span class="pl-s">"b"</span>))
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Printf</span>(<span class="pl-s">"%+v<span class="pl-cce">\n</span>"</span>, <span class="pl-s1">s</span>)
|
||||
}
|
||||
|
||||
<span class="pl-k">type</span> <span class="pl-smi">S</span> <span class="pl-k">struct</span> {
|
||||
|
@ -236,22 +236,22 @@ internal
|
|||
|
||||
<span class="pl-k">type</span> <span class="pl-smi">OptionS</span> <span class="pl-k">func</span>(<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">S</span>)
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">WithA</span>(<span class="pl-s1">a</span> <span class="pl-smi">int</span>) <span class="pl-smi">OptionS</span> {
|
||||
<span class="pl-k">func</span> <span class="pl-s1">WithA</span>(<span class="pl-s1">a</span> <span class="pl-smi">int</span>) <span class="pl-smi">OptionS</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-k">func</span>(<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">S</span>) {
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">fieldA</span> <span class="pl-c1">=</span> <span class="pl-s1">a</span>
|
||||
}
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">WithB</span>(<span class="pl-s1">b</span> <span class="pl-smi">string</span>) <span class="pl-smi">OptionS</span> {
|
||||
<span class="pl-k">func</span> <span class="pl-s1">WithB</span>(<span class="pl-s1">b</span> <span class="pl-smi">string</span>) <span class="pl-smi">OptionS</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-k">func</span>(<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">S</span>) {
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">fieldB</span> <span class="pl-c1">=</span> <span class="pl-s1">b</span>
|
||||
}
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">NewS</span>(<span class="pl-s1">opts</span> <span class="pl-c1">...</span><span class="pl-smi">OptionS</span>) <span class="pl-c1">*</span><span class="pl-smi">S</span> {
|
||||
<span class="pl-k">func</span> <span class="pl-s1">NewS</span>(<span class="pl-s1">opts</span> <span class="pl-c1">...</span><span class="pl-smi">OptionS</span>) <span class="pl-c1">*</span><span class="pl-smi">S</span> {
|
||||
<span class="pl-s1">s</span> <span class="pl-c1">:=</span> <span class="pl-c1">&</span><span class="pl-smi">S</span>{}
|
||||
<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">opt</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">opts</span> {
|
||||
<span class="pl-en">opt</span>(<span class="pl-s1">s</span>)
|
||||
<span class="pl-s1">opt</span>(<span class="pl-s1">s</span>)
|
||||
}
|
||||
<span class="pl-k">return</span> <span class="pl-s1">s</span>
|
||||
}</pre>
|
||||
|
@ -292,19 +292,19 @@ internal
|
|||
</p>
|
||||
<p>Example:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-s1">eg</span>, <span class="pl-s1">egCtx</span> <span class="pl-c1">:=</span> <span class="pl-s1">errgroup</span>.<span class="pl-en">WithContext</span>(<span class="pl-s1">ctx</span>)
|
||||
<pre><span class="pl-s1">eg</span>, <span class="pl-s1">egCtx</span> <span class="pl-c1">:=</span> <span class="pl-s1">errgroup</span>.<span class="pl-c1">WithContext</span>(<span class="pl-s1">ctx</span>)
|
||||
|
||||
<span class="pl-s1">eg</span>.<span class="pl-en">Go</span>(<span class="pl-k">func</span>() <span class="pl-smi">error</span> {
|
||||
<span class="pl-s1">eg</span>.<span class="pl-c1">Go</span>(<span class="pl-k">func</span>() <span class="pl-smi">error</span> {
|
||||
<span class="pl-c">// Do some thing</span>
|
||||
<span class="pl-k">return</span> <span class="pl-c1">nil</span>
|
||||
})
|
||||
|
||||
<span class="pl-s1">eg</span>.<span class="pl-en">Go</span>(<span class="pl-k">func</span>() <span class="pl-smi">error</span> {
|
||||
<span class="pl-s1">eg</span>.<span class="pl-c1">Go</span>(<span class="pl-k">func</span>() <span class="pl-smi">error</span> {
|
||||
<span class="pl-c">// Do other thing</span>
|
||||
<span class="pl-k">return</span> <span class="pl-c1">nil</span>
|
||||
})
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">eg</span>.<span class="pl-en">Wait</span>(); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">eg</span>.<span class="pl-c1">Wait</span>(); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-c">// Handle error</span>
|
||||
}</pre>
|
||||
</div>
|
||||
|
@ -346,27 +346,27 @@ internal
|
|||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">var</span> <span class="pl-s1">bufPool</span> <span class="pl-c1">=</span> sync.<span class="pl-smi">Pool</span>{
|
||||
<span class="pl-s1">New</span>: <span class="pl-k">func</span>() <span class="pl-smi">any</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-en">new</span>(bytes.<span class="pl-smi">Buffer</span>)
|
||||
<span class="pl-k">return</span> <span class="pl-s1">new</span>(bytes.<span class="pl-smi">Buffer</span>)
|
||||
},
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">MarshalWithoutEscapeHTML</span>(<span class="pl-s1">v</span> <span class="pl-smi">any</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {
|
||||
<span class="pl-s1">b</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">bufPool</span>.<span class="pl-en">Get</span>().(<span class="pl-c1">*</span>bytes.<span class="pl-smi">Buffer</span>)
|
||||
<span class="pl-k">func</span> <span class="pl-s1">MarshalWithoutEscapeHTML</span>(<span class="pl-s1">v</span> <span class="pl-smi">any</span>) ([]<span class="pl-smi">byte</span>, <span class="pl-smi">error</span>) {
|
||||
<span class="pl-s1">b</span>, <span class="pl-s1">ok</span> <span class="pl-c1">:=</span> <span class="pl-s1">bufPool</span>.<span class="pl-c1">Get</span>().(<span class="pl-c1">*</span>bytes.<span class="pl-smi">Buffer</span>)
|
||||
<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">ok</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">ErrBufPoolNotBytesBuffer</span>
|
||||
}
|
||||
|
||||
<span class="pl-s1">b</span>.<span class="pl-en">Reset</span>()
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">bufPool</span>.<span class="pl-en">Put</span>(<span class="pl-s1">b</span>)
|
||||
<span class="pl-s1">b</span>.<span class="pl-c1">Reset</span>()
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">bufPool</span>.<span class="pl-c1">Put</span>(<span class="pl-s1">b</span>)
|
||||
|
||||
<span class="pl-s1">encoder</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-en">NewEncoder</span>(<span class="pl-s1">b</span>)
|
||||
<span class="pl-s1">encoder</span>.<span class="pl-en">SetEscapeHTML</span>(<span class="pl-c1">false</span>)
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">encoder</span>.<span class="pl-en">Encode</span>(<span class="pl-s1">v</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-s1">encoder</span> <span class="pl-c1">:=</span> <span class="pl-s1">json</span>.<span class="pl-c1">NewEncoder</span>(<span class="pl-s1">b</span>)
|
||||
<span class="pl-s1">encoder</span>.<span class="pl-c1">SetEscapeHTML</span>(<span class="pl-c1">false</span>)
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">encoder</span>.<span class="pl-c1">Encode</span>(<span class="pl-s1">v</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-c1">nil</span>, <span class="pl-s1">err</span>
|
||||
}
|
||||
|
||||
<span class="pl-s1">result</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">byte</span>, <span class="pl-s1">b</span>.<span class="pl-en">Len</span>())
|
||||
<span class="pl-en">copy</span>(<span class="pl-s1">result</span>, <span class="pl-s1">b</span>.<span class="pl-en">Bytes</span>())
|
||||
<span class="pl-s1">result</span> <span class="pl-c1">:=</span> <span class="pl-s1">make</span>([]<span class="pl-smi">byte</span>, <span class="pl-s1">b</span>.<span class="pl-c1">Len</span>())
|
||||
<span class="pl-s1">copy</span>(<span class="pl-s1">result</span>, <span class="pl-s1">b</span>.<span class="pl-c1">Bytes</span>())
|
||||
<span class="pl-k">return</span> <span class="pl-s1">result</span>, <span class="pl-c1">nil</span>
|
||||
}</pre>
|
||||
</div>
|
||||
|
@ -391,13 +391,13 @@ internal
|
|||
</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-c">// Ptr takes in non-pointer and returns a pointer</span>
|
||||
<span class="pl-k">func</span> <span class="pl-en">Ptr</span>[<span class="pl-s1">T</span> <span class="pl-smi">any</span>](<span class="pl-s1">v</span> <span class="pl-smi">T</span>) <span class="pl-c1">*</span><span class="pl-smi">T</span> {
|
||||
<span class="pl-k">func</span> <span class="pl-s1">Ptr</span>[<span class="pl-s1">T</span> <span class="pl-smi">any</span>](<span class="pl-s1">v</span> <span class="pl-smi">T</span>) <span class="pl-c1">*</span><span class="pl-smi">T</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-c1">&</span><span class="pl-s1">v</span>
|
||||
}</pre>
|
||||
</div>
|
||||
<p>Return zero value:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">func</span> <span class="pl-en">Zero</span>[<span class="pl-s1">T</span> <span class="pl-smi">any</span>]() <span class="pl-smi">T</span> {
|
||||
<pre><span class="pl-k">func</span> <span class="pl-s1">Zero</span>[<span class="pl-s1">T</span> <span class="pl-smi">any</span>]() <span class="pl-smi">T</span> {
|
||||
<span class="pl-k">var</span> <span class="pl-s1">zero</span> <span class="pl-smi">T</span>
|
||||
<span class="pl-k">return</span> <span class="pl-s1">zero</span>
|
||||
}</pre>
|
||||
|
@ -584,8 +584,8 @@ internal
|
|||
<p>Remember to free resources after parse multipart form:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">defer</span> <span class="pl-k">func</span>() {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">c</span>.<span class="pl-c1">Request</span>.<span class="pl-c1">MultipartForm</span>.<span class="pl-en">RemoveAll</span>(); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s1">err</span>)
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">c</span>.<span class="pl-c1">Request</span>.<span class="pl-c1">MultipartForm</span>.<span class="pl-c1">RemoveAll</span>(); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s1">err</span>)
|
||||
}
|
||||
}()</pre>
|
||||
</div>
|
||||
|
@ -723,14 +723,14 @@ internal
|
|||
</p>
|
||||
<p>Example:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">func</span> (<span class="pl-s1">c</span> <span class="pl-c1">*</span><span class="pl-smi">client</span>) <span class="pl-en">HSetWithExpire</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">key</span> <span class="pl-smi">string</span>, <span class="pl-s1">values</span> []<span class="pl-smi">any</span>, <span class="pl-s1">expired</span> time.<span class="pl-smi">Duration</span>) <span class="pl-smi">error</span> {
|
||||
<span class="pl-s1">cmds</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]redis.<span class="pl-smi">Cmder</span>, <span class="pl-c1">2</span>)
|
||||
<pre><span class="pl-k">func</span> (<span class="pl-s1">c</span> <span class="pl-c1">*</span><span class="pl-smi">client</span>) <span class="pl-c1">HSetWithExpire</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">key</span> <span class="pl-smi">string</span>, <span class="pl-s1">values</span> []<span class="pl-smi">any</span>, <span class="pl-s1">expired</span> time.<span class="pl-smi">Duration</span>) <span class="pl-smi">error</span> {
|
||||
<span class="pl-s1">cmds</span> <span class="pl-c1">:=</span> <span class="pl-s1">make</span>([]redis.<span class="pl-smi">Cmder</span>, <span class="pl-c1">2</span>)
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">c</span>.<span class="pl-en">Pipelined</span>(<span class="pl-s1">ctx</span>, <span class="pl-k">func</span>(<span class="pl-s1">pipe</span> redis.<span class="pl-smi">Pipeliner</span>) <span class="pl-smi">error</span> {
|
||||
<span class="pl-s1">cmds</span>[<span class="pl-c1">0</span>] <span class="pl-c1">=</span> <span class="pl-s1">pipe</span>.<span class="pl-en">HSet</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">key</span>, <span class="pl-s1">values</span><span class="pl-c1">...</span>)
|
||||
<span class="pl-k">if</span> <span class="pl-s1">_</span>, <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">c</span>.<span class="pl-c1">Pipelined</span>(<span class="pl-s1">ctx</span>, <span class="pl-k">func</span>(<span class="pl-s1">pipe</span> redis.<span class="pl-smi">Pipeliner</span>) <span class="pl-smi">error</span> {
|
||||
<span class="pl-s1">cmds</span>[<span class="pl-c1">0</span>] <span class="pl-c1">=</span> <span class="pl-s1">pipe</span>.<span class="pl-c1">HSet</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">key</span>, <span class="pl-s1">values</span><span class="pl-c1">...</span>)
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">expired</span> <span class="pl-c1">></span> <span class="pl-c1">0</span> {
|
||||
<span class="pl-s1">cmds</span>[<span class="pl-c1">1</span>] <span class="pl-c1">=</span> <span class="pl-s1">pipe</span>.<span class="pl-en">Expire</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">key</span>, <span class="pl-s1">expired</span>)
|
||||
<span class="pl-s1">cmds</span>[<span class="pl-c1">1</span>] <span class="pl-c1">=</span> <span class="pl-s1">pipe</span>.<span class="pl-c1">Expire</span>(<span class="pl-s1">ctx</span>, <span class="pl-s1">key</span>, <span class="pl-s1">expired</span>)
|
||||
}
|
||||
|
||||
<span class="pl-k">return</span> <span class="pl-c1">nil</span>
|
||||
|
@ -743,7 +743,7 @@ internal
|
|||
<span class="pl-k">continue</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">cmd</span>.<span class="pl-en">Err</span>(); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">cmd</span>.<span class="pl-c1">Err</span>(); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">err</span>
|
||||
}
|
||||
}
|
||||
|
@ -884,10 +884,10 @@ internal
|
|||
<p>Don't cast enum:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-c">// Bad</span>
|
||||
<span class="pl-s1">a</span> <span class="pl-c1">:=</span> <span class="pl-s1">cast</span>.<span class="pl-en">ToInt32</span>(<span class="pl-s1">servicev1</span>.<span class="pl-c1">ReasonCode_ABC</span>)
|
||||
<span class="pl-s1">a</span> <span class="pl-c1">:=</span> <span class="pl-s1">cast</span>.<span class="pl-c1">ToInt32</span>(<span class="pl-s1">servicev1</span>.<span class="pl-c1">ReasonCode_ABC</span>)
|
||||
|
||||
<span class="pl-c">// Good</span>
|
||||
<span class="pl-s1">a</span> <span class="pl-c1">:=</span> <span class="pl-en">int32</span>(<span class="pl-s1">servicev1</span>.<span class="pl-c1">ReasonCode_ABC</span>)</pre>
|
||||
<span class="pl-s1">a</span> <span class="pl-c1">:=</span> <span class="pl-s1">int32</span>(<span class="pl-s1">servicev1</span>.<span class="pl-c1">ReasonCode_ABC</span>)</pre>
|
||||
</div>
|
||||
<div class="markdown-heading">
|
||||
<h3 class="heading-element">
|
||||
|
|
|
@ -83,8 +83,8 @@
|
|||
}
|
||||
|
||||
<span class="pl-c">// c is Client</span>
|
||||
<span class="pl-s1">c</span>.<span class="pl-en">GetUser</span>()
|
||||
<span class="pl-s1">c</span>.<span class="pl-en">RemoveAccount</span>()</pre>
|
||||
<span class="pl-s1">c</span>.<span class="pl-c1">GetUser</span>()
|
||||
<span class="pl-s1">c</span>.<span class="pl-c1">RemoveAccount</span>()</pre>
|
||||
</div>
|
||||
<p>Try:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
|
@ -104,8 +104,8 @@
|
|||
}
|
||||
|
||||
<span class="pl-c">// c is Client</span>
|
||||
<span class="pl-s1">c</span>.<span class="pl-c1">User</span>.<span class="pl-en">Get</span>()
|
||||
<span class="pl-s1">c</span>.<span class="pl-c1">Account</span>.<span class="pl-en">Remove</span>()</pre>
|
||||
<span class="pl-s1">c</span>.<span class="pl-c1">User</span>.<span class="pl-c1">Get</span>()
|
||||
<span class="pl-s1">c</span>.<span class="pl-c1">Account</span>.<span class="pl-c1">Remove</span>()</pre>
|
||||
</div>
|
||||
<p>
|
||||
The difference is <code>c.GetUser()</code> ->
|
||||
|
|
|
@ -511,6 +511,15 @@
|
|||
>
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<a
|
||||
href="https://www.depesz.com/2024/12/01/sql-best-practices-dont-compare-count-with-0/"
|
||||
rel="nofollow"
|
||||
>SQL best practices – don’t compare count(*) with 0</a
|
||||
>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div>
|
||||
|
|
|
@ -141,25 +141,25 @@
|
|||
<span class="pl-c1">verifyService</span> <span class="pl-smi">VerifyService</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">service</span>) <span class="pl-en">Upload</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">req</span> <span class="pl-smi">Request</span>) <span class="pl-smi">error</span> {
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">service</span>) <span class="pl-c1">Upload</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>, <span class="pl-s1">req</span> <span class="pl-smi">Request</span>) <span class="pl-smi">error</span> {
|
||||
<span class="pl-c">// I simplify by omitting the response, only care error for now</span>
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-en">Verify</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-c1">Verify</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">err</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">minio</span>.<span class="pl-en">Put</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">minio</span>.<span class="pl-c1">Put</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">err</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">redis</span>.<span class="pl-en">Set</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">redis</span>.<span class="pl-c1">Set</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">err</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">db</span>.<span class="pl-en">Save</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">db</span>.<span class="pl-c1">Save</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">err</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">logService</span>.<span class="pl-en">Save</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">logService</span>.<span class="pl-c1">Save</span>(<span class="pl-s1">req</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">err</span>
|
||||
}
|
||||
|
||||
|
@ -184,12 +184,12 @@
|
|||
<span class="pl-c1">s</span> <span class="pl-smi">service</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">ServiceSuite</span>) <span class="pl-en">SetupTest</span>() {
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">ServiceSuite</span>) <span class="pl-c1">SetupTest</span>() {
|
||||
<span class="pl-c">// Init mock</span>
|
||||
<span class="pl-c">// Init service</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">ServiceSuite</span>) <span class="pl-en">TestUpload</span>() {
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">ServiceSuite</span>) <span class="pl-c1">TestUpload</span>() {
|
||||
<span class="pl-s1">tests</span> <span class="pl-c1">:=</span> []<span class="pl-k">struct</span>{
|
||||
<span class="pl-c1">name</span> <span class="pl-smi">string</span>
|
||||
<span class="pl-c1">req</span> <span class="pl-smi">Request</span>
|
||||
|
@ -206,15 +206,15 @@
|
|||
}
|
||||
|
||||
<span class="pl-k">for</span> <span class="pl-s1">_</span>, <span class="pl-s1">tc</span> <span class="pl-c1">:=</span> <span class="pl-k">range</span> <span class="pl-s1">tests</span> {
|
||||
<span class="pl-s1">s</span>.<span class="pl-en">Run</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">name</span>, <span class="pl-k">func</span>(){
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">Run</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">name</span>, <span class="pl-k">func</span>(){
|
||||
<span class="pl-c">// Mock all error depends on test case</span>
|
||||
<span class="pl-k">if</span> <span class="pl-s1">tc</span>.<span class="pl-c1">verifyErr</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-en">MockVerify</span>().<span class="pl-en">Return</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">verifyErr</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-c1">MockVerify</span>().<span class="pl-c1">Return</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">verifyErr</span>)
|
||||
}
|
||||
<span class="pl-c">// ...</span>
|
||||
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-en">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-en">Equal</span>(<span class="pl-s1">wantErr</span>, <span class="pl-s1">gotErr</span>)
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-c1">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">Equal</span>(<span class="pl-s1">wantErr</span>, <span class="pl-s1">gotErr</span>)
|
||||
})
|
||||
}
|
||||
}</pre>
|
||||
|
@ -326,36 +326,36 @@
|
|||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-c">// Init ServiceSuite as above</span>
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">ServiceSuite</span>) <span class="pl-en">TestUpload</span>() {
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">s</span> <span class="pl-c1">*</span><span class="pl-smi">ServiceSuite</span>) <span class="pl-c1">TestUpload</span>() {
|
||||
<span class="pl-c">// Init success request</span>
|
||||
<span class="pl-s1">req</span> <span class="pl-c1">:=</span> <span class="pl-smi">Request</span>{
|
||||
<span class="pl-c">// ...</span>
|
||||
}
|
||||
|
||||
<span class="pl-c">// Init success action</span>
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-en">MockVerify</span>().<span class="pl-en">Return</span>(<span class="pl-c1">nil</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-c1">MockVerify</span>().<span class="pl-c1">Return</span>(<span class="pl-c1">nil</span>)
|
||||
<span class="pl-c">// ...</span>
|
||||
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-en">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-en">NoError</span>(<span class="pl-s1">gotErr</span>)
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-c1">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">NoError</span>(<span class="pl-s1">gotErr</span>)
|
||||
|
||||
<span class="pl-s1">s</span>.<span class="pl-en">Run</span>(<span class="pl-s">"failed"</span>, <span class="pl-k">func</span>(){
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">Run</span>(<span class="pl-s">"failed"</span>, <span class="pl-k">func</span>(){
|
||||
<span class="pl-c">// Alter failed request from default</span>
|
||||
<span class="pl-s1">req</span> <span class="pl-c1">:=</span> <span class="pl-smi">Request</span>{
|
||||
<span class="pl-c">// ...</span>
|
||||
}
|
||||
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-en">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-en">Error</span>(<span class="pl-s1">gotErr</span>)
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-c1">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">Error</span>(<span class="pl-s1">gotErr</span>)
|
||||
})
|
||||
|
||||
<span class="pl-s1">s</span>.<span class="pl-en">Run</span>(<span class="pl-s">"another failed"</span>, <span class="pl-k">func</span>(){
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">Run</span>(<span class="pl-s">"another failed"</span>, <span class="pl-k">func</span>(){
|
||||
<span class="pl-c">// Alter verify return</span>
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-en">MockVerify</span>().<span class="pl-en">Return</span>(<span class="pl-s1">someErr</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">verifyService</span>.<span class="pl-c1">MockVerify</span>().<span class="pl-c1">Return</span>(<span class="pl-s1">someErr</span>)
|
||||
|
||||
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-en">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-en">Error</span>(<span class="pl-s1">gotErr</span>)
|
||||
<span class="pl-s1">gotErr</span> <span class="pl-c1">:=</span> <span class="pl-s1">s</span>.<span class="pl-c1">service</span>.<span class="pl-c1">Upload</span>(<span class="pl-s1">tc</span>.<span class="pl-c1">req</span>)
|
||||
<span class="pl-s1">s</span>.<span class="pl-c1">Error</span>(<span class="pl-s1">gotErr</span>)
|
||||
})
|
||||
|
||||
<span class="pl-c">// ...</span>
|
||||
|
|
|
@ -81,12 +81,12 @@
|
|||
</p>
|
||||
<p>My buggy code is like this:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-en">doA</span>(<span class="pl-s1">ctx</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-s1">log</span>.<span class="pl-en">Error</span>(<span class="pl-s1">err</span>)
|
||||
<pre><span class="pl-k">if</span> <span class="pl-s1">err</span> <span class="pl-c1">:=</span> <span class="pl-s1">doA</span>(<span class="pl-s1">ctx</span>); <span class="pl-s1">err</span> <span class="pl-c1">!=</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-s1">log</span>.<span class="pl-c1">Error</span>(<span class="pl-s1">err</span>)
|
||||
<span class="pl-c">// Skip error</span>
|
||||
}
|
||||
|
||||
<span class="pl-en">doB</span>(<span class="pl-s1">ctx</span>)</pre>
|
||||
<span class="pl-s1">doB</span>(<span class="pl-s1">ctx</span>)</pre>
|
||||
</div>
|
||||
<p>
|
||||
The problem is <code>doA</code> taking too long, so <code>ctx</code> is
|
||||
|
@ -102,35 +102,35 @@
|
|||
>):
|
||||
</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">func</span> <span class="pl-en">main</span>() {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">cancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">WithTimeout</span>(<span class="pl-s1">context</span>.<span class="pl-en">Background</span>(), <span class="pl-c1">2</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-en">cancel</span>()
|
||||
<pre><span class="pl-k">func</span> <span class="pl-s1">main</span>() {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">cancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-c1">WithTimeout</span>(<span class="pl-s1">context</span>.<span class="pl-c1">Background</span>(), <span class="pl-c1">2</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">cancel</span>()
|
||||
|
||||
<span class="pl-en">doA</span>(<span class="pl-s1">ctx</span>)
|
||||
<span class="pl-en">doB</span>(<span class="pl-s1">ctx</span>)
|
||||
<span class="pl-s1">doA</span>(<span class="pl-s1">ctx</span>)
|
||||
<span class="pl-s1">doB</span>(<span class="pl-s1">ctx</span>)
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">doA</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">WithTimeout</span>(<span class="pl-s1">ctx</span>, <span class="pl-c1">1</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-en">ctxCancel</span>()
|
||||
<span class="pl-k">func</span> <span class="pl-s1">doA</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-c1">WithTimeout</span>(<span class="pl-s1">ctx</span>, <span class="pl-c1">1</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">ctxCancel</span>()
|
||||
|
||||
<span class="pl-k">select</span> {
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-en">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doA"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-en">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doA"</span>, <span class="pl-s1">ctx</span>.<span class="pl-en">Err</span>())
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-c1">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doA"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-c1">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doA"</span>, <span class="pl-s1">ctx</span>.<span class="pl-c1">Err</span>())
|
||||
}
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">doB</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">WithTimeout</span>(<span class="pl-s1">ctx</span>, <span class="pl-c1">3</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-en">ctxCancel</span>()
|
||||
<span class="pl-k">func</span> <span class="pl-s1">doB</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-c1">WithTimeout</span>(<span class="pl-s1">ctx</span>, <span class="pl-c1">3</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">ctxCancel</span>()
|
||||
|
||||
<span class="pl-k">select</span> {
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-en">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doB"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-en">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doB"</span>, <span class="pl-s1">ctx</span>.<span class="pl-en">Err</span>())
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-c1">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doB"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-c1">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doB"</span>, <span class="pl-s1">ctx</span>.<span class="pl-c1">Err</span>())
|
||||
}
|
||||
}</pre>
|
||||
</div>
|
||||
|
@ -185,9 +185,9 @@ doB context deadline exceeded</pre
|
|||
>:
|
||||
</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">func</span> <span class="pl-en">DisconnectContext</span>(<span class="pl-s1">parent</span> context.<span class="pl-smi">Context</span>) context.<span class="pl-smi">Context</span> {
|
||||
<pre><span class="pl-k">func</span> <span class="pl-s1">DisconnectContext</span>(<span class="pl-s1">parent</span> context.<span class="pl-smi">Context</span>) context.<span class="pl-smi">Context</span> {
|
||||
<span class="pl-k">if</span> <span class="pl-s1">parent</span> <span class="pl-c1">==</span> <span class="pl-c1">nil</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">context</span>.<span class="pl-en">Background</span>()
|
||||
<span class="pl-k">return</span> <span class="pl-s1">context</span>.<span class="pl-c1">Background</span>()
|
||||
}
|
||||
|
||||
<span class="pl-k">return</span> <span class="pl-smi">disconnectedContext</span>{
|
||||
|
@ -199,20 +199,20 @@ doB context deadline exceeded</pre
|
|||
<span class="pl-c1">parent</span> context.<span class="pl-smi">Context</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-en">Deadline</span>() (<span class="pl-s1">deadline</span> time.<span class="pl-smi">Time</span>, <span class="pl-s1">ok</span> <span class="pl-smi">bool</span>) {
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-c1">Deadline</span>() (<span class="pl-s1">deadline</span> time.<span class="pl-smi">Time</span>, <span class="pl-s1">ok</span> <span class="pl-smi">bool</span>) {
|
||||
<span class="pl-k">return</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-en">Done</span>() <span class="pl-c1"><-</span><span class="pl-k">chan</span> <span class="pl-k">struct</span>{} {
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-c1">Done</span>() <span class="pl-c1"><-</span><span class="pl-k">chan</span> <span class="pl-k">struct</span>{} {
|
||||
<span class="pl-k">return</span> <span class="pl-c1">nil</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-en">Err</span>() <span class="pl-smi">error</span> {
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-c1">Err</span>() <span class="pl-smi">error</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-c1">nil</span>
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-en">Value</span>(<span class="pl-s1">key</span> <span class="pl-smi">any</span>) <span class="pl-smi">any</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">ctx</span>.<span class="pl-c1">parent</span>.<span class="pl-en">Value</span>(<span class="pl-s1">key</span>)
|
||||
<span class="pl-k">func</span> (<span class="pl-s1">ctx</span> <span class="pl-smi">disconnectedContext</span>) <span class="pl-c1">Value</span>(<span class="pl-s1">key</span> <span class="pl-smi">any</span>) <span class="pl-smi">any</span> {
|
||||
<span class="pl-k">return</span> <span class="pl-s1">ctx</span>.<span class="pl-c1">parent</span>.<span class="pl-c1">Value</span>(<span class="pl-s1">key</span>)
|
||||
}</pre>
|
||||
</div>
|
||||
<p>
|
||||
|
@ -223,34 +223,34 @@ doB context deadline exceeded</pre
|
|||
>):
|
||||
</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">func</span> <span class="pl-en">main</span>() {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">cancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">WithTimeout</span>(<span class="pl-s1">context</span>.<span class="pl-en">Background</span>(), <span class="pl-c1">2</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-en">cancel</span>()
|
||||
<span class="pl-en">doA</span>(<span class="pl-s1">ctx</span>)
|
||||
<span class="pl-en">doB</span>(<span class="pl-s1">ctx</span>)
|
||||
<pre><span class="pl-k">func</span> <span class="pl-s1">main</span>() {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">cancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-c1">WithTimeout</span>(<span class="pl-s1">context</span>.<span class="pl-c1">Background</span>(), <span class="pl-c1">2</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">cancel</span>()
|
||||
<span class="pl-s1">doA</span>(<span class="pl-s1">ctx</span>)
|
||||
<span class="pl-s1">doB</span>(<span class="pl-s1">ctx</span>)
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">doA</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">WithTimeout</span>(<span class="pl-s1">ctx</span>, <span class="pl-c1">1</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-en">ctxCancel</span>()
|
||||
<span class="pl-k">func</span> <span class="pl-s1">doA</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-c1">WithTimeout</span>(<span class="pl-s1">ctx</span>, <span class="pl-c1">1</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">ctxCancel</span>()
|
||||
|
||||
<span class="pl-k">select</span> {
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-en">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doA"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-en">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doA"</span>, <span class="pl-s1">ctx</span>.<span class="pl-en">Err</span>())
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-c1">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doA"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-c1">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doA"</span>, <span class="pl-s1">ctx</span>.<span class="pl-c1">Err</span>())
|
||||
}
|
||||
}
|
||||
|
||||
<span class="pl-k">func</span> <span class="pl-en">doB</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-en">WithTimeout</span>(<span class="pl-en">DisconnectContext</span>(<span class="pl-s1">ctx</span>), <span class="pl-c1">3</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-en">ctxCancel</span>()
|
||||
<span class="pl-k">func</span> <span class="pl-s1">doB</span>(<span class="pl-s1">ctx</span> context.<span class="pl-smi">Context</span>) {
|
||||
<span class="pl-s1">ctx</span>, <span class="pl-s1">ctxCancel</span> <span class="pl-c1">:=</span> <span class="pl-s1">context</span>.<span class="pl-c1">WithTimeout</span>(<span class="pl-s1">DisconnectContext</span>(<span class="pl-s1">ctx</span>), <span class="pl-c1">3</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>)
|
||||
<span class="pl-k">defer</span> <span class="pl-s1">ctxCancel</span>()
|
||||
|
||||
<span class="pl-k">select</span> {
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-en">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doB"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-en">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"doB"</span>, <span class="pl-s1">ctx</span>.<span class="pl-en">Err</span>())
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">time</span>.<span class="pl-c1">After</span>(<span class="pl-c1">2</span> <span class="pl-c1">*</span> <span class="pl-s1">time</span>.<span class="pl-c1">Second</span>):
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doB"</span>)
|
||||
<span class="pl-k">case</span> <span class="pl-c1"><-</span><span class="pl-s1">ctx</span>.<span class="pl-c1">Done</span>():
|
||||
<span class="pl-s1">fmt</span>.<span class="pl-c1">Println</span>(<span class="pl-s">"doB"</span>, <span class="pl-s1">ctx</span>.<span class="pl-c1">Err</span>())
|
||||
}
|
||||
}</pre>
|
||||
</div>
|
||||
|
|
|
@ -271,6 +271,11 @@ sudo pkill bluetoothd</pre
|
|||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://stackoverflow.com/q/72369320" rel="nofollow"
|
||||
>Why always something is running at port 5000 on my mac</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="markdown-heading">
|
||||
<h2 class="heading-element">Firefox</h2>
|
||||
|
|
|
@ -132,7 +132,7 @@
|
|||
</ul>
|
||||
<p>Constant time comparison:</p>
|
||||
<div class="highlight highlight-source-go">
|
||||
<pre><span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1"><</span> <span class="pl-en">len</span>(<span class="pl-s1">x</span>); <span class="pl-s1">i</span><span class="pl-c1">++</span> {
|
||||
<pre><span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1"><</span> <span class="pl-s1">len</span>(<span class="pl-s1">x</span>); <span class="pl-s1">i</span><span class="pl-c1">++</span> {
|
||||
<span class="pl-c">// Use XOR instead of compare x[i] == y[i]</span>
|
||||
<span class="pl-c">// If x[i] == y[i] -> XOR is 1</span>
|
||||
<span class="pl-c">// Otherwise XOR is 0</span>
|
||||
|
|
|
@ -192,3 +192,4 @@ FROM information_schema.statistics;
|
|||
- [Difference between text and varchar (character varying)](https://stackoverflow.com/a/4849030)
|
||||
- [How to get the number of total results when there is LIMIT in query?](https://stackoverflow.com/q/33889922)
|
||||
- [Run a query with a LIMIT/OFFSET and also get the total number of rows](https://stackoverflow.com/q/28888375)
|
||||
- [SQL best practices – don’t compare count(*) with 0](https://www.depesz.com/2024/12/01/sql-best-practices-dont-compare-count-with-0/)
|
||||
|
|
|
@ -136,6 +136,7 @@ Thanks:
|
|||
- [Upgrading Homebrew and avoiding the failed to verify attestation error](https://til.simonwillison.net/homebrew/no-verify-attestations)
|
||||
- [Use iMac M1 accent colours on any Mac](https://georgegarside.com/blog/macos/imac-m1-accent-colours-any-mac/)
|
||||
- https://mahdi.jp/apps/accents
|
||||
- [Why always something is running at port 5000 on my mac](https://stackoverflow.com/q/72369320)
|
||||
|
||||
## Firefox
|
||||
|
||||
|
|
Loading…
Reference in New Issue