From 4f46d262e6967c9c638b40f3b0246d21b7a9b9dc Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 9 Apr 2025 20:29:15 +0900 Subject: feat(blog/nuldoc): rebuild --- .../index.html | 60 ++++++++-------------- 1 file changed, 21 insertions(+), 39 deletions(-) (limited to 'vhosts/blog/public/posts/2024-08-19/go-template-access-outer-scope-pipeline-within-with-or-range') 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 @@
-

TL;DR

+

TL;DR

- 常にトップレベルを指す特殊変数 $ を使えばよい。 + 常にトップレベルを指す特殊変数 $ を使えばよい。

-
-

はじめに

+

はじめに

- Go には、標準ライブラリにテンプレートライブラリ text/template がある。この text/template における制御構造、withrange は次のように使われる。 + Go には、標準ライブラリにテンプレートライブラリ text/template がある。 この text/template における制御構造、withrange は次のように使われる。

-
# {{ .Title }}
 
@@ -85,19 +83,15 @@
   - {{ . }}
 {{ end }}
-

text/template. は、現在の操作対象を表す特殊なオブジェクトである。

-

- withrange は、. を変更する効果を持つ。with は引数に渡されたオブジェクトを . へセットして、内部のテンプレートを実行する。range は引数に渡されたイテレート可能なオブジェクトに対し、それぞれの要素を . へセットして、要素の個数だけ内部のテンプレートを実行する。 + withrange は、. を変更する効果を持つ。 with は引数に渡されたオブジェクトを . へセットして、内部のテンプレートを実行する。 range は引数に渡されたイテレート可能なオブジェクトに対し、それぞれの要素を . へセットして、要素の個数だけ内部のテンプレートを実行する。

-

- つまりこのテンプレートは、次のような構造をレンダリングしている (Execute() の第2引数)。 + つまりこのテンプレートは、次のような構造をレンダリングしている (Execute() の第2引数)。

-
tmpl.Execute(out, Params{
     Title: "foo",
@@ -113,13 +107,11 @@
 })
-
-

やりたいこと

+

やりたいこと

- 今回おこないたいのは、withrange の中で、その外側で使われていたトップレベルのオブジェクトを参照することだ。 + 今回おこないたいのは、withrange の中で、その外側で使われていたトップレベルのオブジェクトを参照することだ。

-
{{ with .User }}
   ここから .Title を参照するには?
@@ -129,34 +121,27 @@
   ここから .User を参照するには?
 {{ end }}
-

- withrange は、. を自身の対象オブジェクトに変更するので、単に {{ with .User }} の中で .Title と書いても、それは UserTitle プロパティを参照しているとみなされる。 + withrange は、. を自身の対象オブジェクトに変更するので、 単に {{ with .User }} の中で .Title と書いても、それは UserTitle プロパティを参照しているとみなされる。

-

- text/template では変数が使えるので、テンプレートの先頭で + text/template では変数が使えるので、テンプレートの先頭で

-
{{ $params := . }}
-

- とでもしておけば実現は可能である。 + とでもしておけば実現は可能である。

-

- しかしながら、頻発するシチュエーションにしてはあまりに不恰好である。よりスマートな方法が用意されているはずだ。 + しかしながら、頻発するシチュエーションにしてはあまりに不恰好である。よりスマートな方法が用意されているはずだ。

-
-

解決方法

+

解決方法

- 常にトップレベルを指す特殊変数 $ を使えばよい。 + 常にトップレベルを指す特殊変数 $ を使えばよい。

-
{{ with .User }}
   {{ $.Title }}
@@ -166,27 +151,24 @@
   {{ $.User.Name }}
 {{ end }}
-

- $ は、テンプレートが実行されるときに渡されたオブジェクトを指す。これを使えば現在の . に関係なくトップレベルを参照できる。 + $ は、テンプレートが実行されるときに渡されたオブジェクトを指す。 これを使えば現在の . に関係なくトップレベルを参照できる。

-

- このことは、text/template の公式ドキュメントにも以下のように記載されている。 + このことは、text/template の公式ドキュメントにも以下のように記載されている。

-
- When execution begins, $ is set to the data argument passed to Execute, that is, to the starting value of dot. +

+ When execution begins, $ is set to the data argument passed to Execute, that is, to the starting value of dot. +

-
-

参考

+

参考