diff options
Diffstat (limited to 'vhosts/blog/public/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html')
| -rw-r--r-- | vhosts/blog/public/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html | 60 |
1 files changed, 21 insertions, 39 deletions
diff --git a/vhosts/blog/public/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html b/vhosts/blog/public/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html index aa6d2afb..2c7cae67 100644 --- a/vhosts/blog/public/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html +++ b/vhosts/blog/public/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range/index.html @@ -58,18 +58,16 @@ </ol> </section> <section id="section--tldr"> - <h2><a href="#section--tldr">TL;DR</a></h2> + <h2><a href="#section--tldr">TL;DR</a></h2> <p> - 常にトップレベルを指す特殊変数 <code>$</code> を使えばよい。 + 常にトップレベルを指す特殊変数 <code>$</code> を使えばよい。 </p> </section> - <section id="section--intro"> - <h2><a href="#section--intro">はじめに</a></h2> + <h2><a href="#section--intro">はじめに</a></h2> <p> - Go には、標準ライブラリにテンプレートライブラリ <code>text/template</code> がある。この <code>text/template</code> における制御構造、<code>with</code> と <code>range</code> は次のように使われる。 + Go には、標準ライブラリにテンプレートライブラリ <code>text/template</code> がある。 この <code>text/template</code> における制御構造、<code>with</code> と <code>range</code> は次のように使われる。 </p> - <div class="codeblock"> <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span># {{ .Title }}</span></span> <span class="line"><span></span></span> @@ -85,19 +83,15 @@ <span class="line"><span> - {{ . }}</span></span> <span class="line"><span>{{ end }}</span></span></code></pre> </div> - <p> <code>text/template</code> の <code>.</code> は、現在の操作対象を表す特殊なオブジェクトである。 </p> - <p> - <code>with</code> や <code>range</code> は、<code>.</code> を変更する効果を持つ。<code>with</code> は引数に渡されたオブジェクトを <code>.</code> へセットして、内部のテンプレートを実行する。<code>range</code> は引数に渡されたイテレート可能なオブジェクトに対し、それぞれの要素を <code>.</code> へセットして、要素の個数だけ内部のテンプレートを実行する。 + <code>with</code> や <code>range</code> は、<code>.</code> を変更する効果を持つ。 <code>with</code> は引数に渡されたオブジェクトを <code>.</code> へセットして、内部のテンプレートを実行する。 <code>range</code> は引数に渡されたイテレート可能なオブジェクトに対し、それぞれの要素を <code>.</code> へセットして、要素の個数だけ内部のテンプレートを実行する。 </p> - <p> - つまりこのテンプレートは、次のような構造をレンダリングしている (<code>Execute()</code> の第2引数)。 + つまりこのテンプレートは、次のような構造をレンダリングしている (<code>Execute()</code> の第2引数)。 </p> - <div class="codeblock" language="go"> <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">tmpl.</span><span style="color:#6F42C1">Execute</span><span style="color:#24292E">(out, </span><span style="color:#6F42C1">Params</span><span style="color:#24292E">{</span></span> <span class="line"><span style="color:#24292E"> Title: </span><span style="color:#032F62">"foo"</span><span style="color:#24292E">,</span></span> @@ -113,13 +107,11 @@ <span class="line"><span style="color:#24292E">})</span></span></code></pre> </div> </section> - <section id="section--what-i-want-to-do"> - <h2><a href="#section--what-i-want-to-do">やりたいこと</a></h2> + <h2><a href="#section--what-i-want-to-do">やりたいこと</a></h2> <p> - 今回おこないたいのは、<code>with</code> や <code>range</code> の中で、その外側で使われていたトップレベルのオブジェクトを参照することだ。 + 今回おこないたいのは、<code>with</code> や <code>range</code> の中で、その外側で使われていたトップレベルのオブジェクトを参照することだ。 </p> - <div class="codeblock"> <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>{{ with .User }}</span></span> <span class="line"><span> ここから .Title を参照するには?</span></span> @@ -129,34 +121,27 @@ <span class="line"><span> ここから .User を参照するには?</span></span> <span class="line"><span>{{ end }}</span></span></code></pre> </div> - <p> - <code>with</code> や <code>range</code> は、<code>.</code> を自身の対象オブジェクトに変更するので、単に <code>{{ with .User }}</code> の中で <code>.Title</code> と書いても、それは <code>User</code> の <code>Title</code> プロパティを参照しているとみなされる。 + <code>with</code> や <code>range</code> は、<code>.</code> を自身の対象オブジェクトに変更するので、 単に <code>{{ with .User }}</code> の中で <code>.Title</code> と書いても、それは <code>User</code> の <code>Title</code> プロパティを参照しているとみなされる。 </p> - <p> - <code>text/template</code> では変数が使えるので、テンプレートの先頭で + <code>text/template</code> では変数が使えるので、テンプレートの先頭で </p> - <div class="codeblock"> <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>{{ $params := . }}</span></span></code></pre> </div> - <p> - とでもしておけば実現は可能である。 + とでもしておけば実現は可能である。 </p> - <p> - しかしながら、頻発するシチュエーションにしてはあまりに不恰好である。よりスマートな方法が用意されているはずだ。 + しかしながら、頻発するシチュエーションにしてはあまりに不恰好である。よりスマートな方法が用意されているはずだ。 </p> </section> - <section id="section--solution"> - <h2><a href="#section--solution">解決方法</a></h2> + <h2><a href="#section--solution">解決方法</a></h2> <p> - 常にトップレベルを指す特殊変数 <code>$</code> を使えばよい。 + 常にトップレベルを指す特殊変数 <code>$</code> を使えばよい。 </p> - <div class="codeblock"> <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>{{ with .User }}</span></span> <span class="line"><span> {{ $.Title }}</span></span> @@ -166,27 +151,24 @@ <span class="line"><span> {{ $.User.Name }}</span></span> <span class="line"><span>{{ end }}</span></span></code></pre> </div> - <p> - <code>$</code> は、テンプレートが実行されるときに渡されたオブジェクトを指す。これを使えば現在の <code>.</code> に関係なくトップレベルを参照できる。 + <code>$</code> は、テンプレートが実行されるときに渡されたオブジェクトを指す。 これを使えば現在の <code>.</code> に関係なくトップレベルを参照できる。 </p> - <p> - このことは、<a href="https://pkg.go.dev/text/template#hdr-Variables" rel="noreferrer" target="_blank"><code>text/template</code> の公式ドキュメント</a>にも以下のように記載されている。 + このことは、<a href="https://pkg.go.dev/text/template#hdr-Variables" rel="noreferrer" target="_blank"><code>text/template</code> の公式ドキュメント</a>にも以下のように記載されている。 </p> - <blockquote> - When execution begins, $ is set to the data argument passed to Execute, that is, to the starting value of dot. + <p> + When execution begins, $ is set to the data argument passed to Execute, that is, to the starting value of dot. + </p> </blockquote> </section> - <section id="section--reference"> - <h2><a href="#section--reference">参考</a></h2> + <h2><a href="#section--reference">参考</a></h2> <ul> <li> - <a href="https://stackoverflow.com/questions/14800204/in-a-template-how-do-you-access-an-outer-scope-while-inside-of-a-with-or-rang" rel="noreferrer" target="_blank">直接の出典である Stack Overflow の回答: "In a template how do you access an outer scope while inside of a "with" or "range" scope?"</a> + <a href="https://stackoverflow.com/questions/14800204/in-a-template-how-do-you-access-an-outer-scope-while-inside-of-a-with-or-rang" rel="noreferrer" target="_blank">直接の出典である Stack Overflow の回答: <span>In a template how do you access an outer scope while inside of a “with” or “range” scope?</span></a> </li> - <li> <a href="https://pkg.go.dev/text/template#hdr-Variables" rel="noreferrer" target="_blank">大元の出典である <code>text/template</code> の公式ドキュメント</a> </li> |
