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 | 93 |
1 files changed, 51 insertions, 42 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 2d2c3761..aa6d2afb 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 @@ -14,8 +14,7 @@ <meta property="og:locale" content="ja_JP"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Go】 text/template の with や range の内側から外側の "." にアクセスする|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=79020a898c7052f79b32e90376a4497d"> - <link rel="stylesheet" href="/hl.css?h=340e65ffd5c17713efc9107c06304f7b"> + <link rel="stylesheet" href="/style.css?h=60eb349e583f5bd51518a7eb98598043"> </head> <body class="single"> <header class="header"> @@ -71,19 +70,21 @@ Go には、標準ライブラリにテンプレートライブラリ <code>text/template</code> がある。この <code>text/template</code> における制御構造、<code>with</code> と <code>range</code> は次のように使われる。 </p> - <pre class="highlight"><code># {{ .Title }} - -# User - -{{ with .User }} - {{ .Name }} ({{ .ID }}) -{{ end }} - -# Items - -{{ range .Items }} - - {{ . }} -{{ end }}</code></pre> + <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> +<span class="line"><span># User</span></span> +<span class="line"><span></span></span> +<span class="line"><span>{{ with .User }}</span></span> +<span class="line"><span> {{ .Name }} ({{ .ID }})</span></span> +<span class="line"><span>{{ end }}</span></span> +<span class="line"><span></span></span> +<span class="line"><span># Items</span></span> +<span class="line"><span></span></span> +<span class="line"><span>{{ range .Items }}</span></span> +<span class="line"><span> - {{ . }}</span></span> +<span class="line"><span>{{ end }}</span></span></code></pre> + </div> <p> <code>text/template</code> の <code>.</code> は、現在の操作対象を表す特殊なオブジェクトである。 @@ -97,18 +98,20 @@ つまりこのテンプレートは、次のような構造をレンダリングしている (<code>Execute()</code> の第2引数)。 </p> - <pre class="highlight" language="go"><code class="highlight">tmpl.Execute(out, Params{ - Title: <span class="hljs-string">"foo"</span>, - User: User{ - ID: <span class="hljs-number">123</span>, - Name: <span class="hljs-string">"john"</span>, - }, - Items: []<span class="hljs-type">string</span>{ - <span class="hljs-string">"hoge"</span>, - <span class="hljs-string">"piyo"</span>, - <span class="hljs-string">"fuga"</span>, - }, -})</code></pre> + <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> +<span class="line"><span style="color:#24292E"> User: </span><span style="color:#6F42C1">User</span><span style="color:#24292E">{</span></span> +<span class="line"><span style="color:#24292E"> ID: </span><span style="color:#005CC5">123</span><span style="color:#24292E">,</span></span> +<span class="line"><span style="color:#24292E"> Name: </span><span style="color:#032F62">"john"</span><span style="color:#24292E">,</span></span> +<span class="line"><span style="color:#24292E"> },</span></span> +<span class="line"><span style="color:#24292E"> Items: []</span><span style="color:#D73A49">string</span><span style="color:#24292E">{</span></span> +<span class="line"><span style="color:#032F62"> "hoge"</span><span style="color:#24292E">,</span></span> +<span class="line"><span style="color:#032F62"> "piyo"</span><span style="color:#24292E">,</span></span> +<span class="line"><span style="color:#032F62"> "fuga"</span><span style="color:#24292E">,</span></span> +<span class="line"><span style="color:#24292E"> },</span></span> +<span class="line"><span style="color:#24292E">})</span></span></code></pre> + </div> </section> <section id="section--what-i-want-to-do"> @@ -117,13 +120,15 @@ 今回おこないたいのは、<code>with</code> や <code>range</code> の中で、その外側で使われていたトップレベルのオブジェクトを参照することだ。 </p> - <pre class="highlight"><code>{{ with .User }} - ここから .Title を参照するには? -{{ end }} - -{{ range .Items }} - ここから .User を参照するには? -{{ end }}</code></pre> + <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> +<span class="line"><span>{{ end }}</span></span> +<span class="line"><span></span></span> +<span class="line"><span>{{ range .Items }}</span></span> +<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> プロパティを参照しているとみなされる。 @@ -133,7 +138,9 @@ <code>text/template</code> では変数が使えるので、テンプレートの先頭で </p> - <pre class="highlight"><code>{{ $params := . }}</code></pre> + <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> とでもしておけば実現は可能である。 @@ -150,13 +157,15 @@ 常にトップレベルを指す特殊変数 <code>$</code> を使えばよい。 </p> - <pre class="highlight"><code>{{ with .User }} - {{ $.Title }} -{{ end }} - -{{ range .Items }} - {{ $.User.Name }} -{{ end }}</code></pre> + <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> +<span class="line"><span>{{ end }}</span></span> +<span class="line"><span></span></span> +<span class="line"><span>{{ range .Items }}</span></span> +<span class="line"><span> {{ $.User.Name }}</span></span> +<span class="line"><span>{{ end }}</span></span></code></pre> + </div> <p> <code>$</code> は、テンプレートが実行されるときに渡されたオブジェクトを指す。これを使えば現在の <code>.</code> に関係なくトップレベルを参照できる。 |
