with
文法
with EXPR
偽値 (falsy value) とは false
、0
、nil
ポインター、インターフェース値、配列、スライス、マップ、長さゼロの文字列、ゼロの time.Time
値、です。
これ以外はすべて真値 (truthy) です。
{{ $var := "foo" }}
{{ with $var }}
{{ . }} → foo
{{ end }}
else
ステートメントとともに利用した例です。
{{ $var := "foo" }}
{{ with $var }}
{{ . }} → foo
{{ else }}
{{ print "var is falsy" }}
{{ end }}
Use else with
to check multiple conditions:
{{ $v1 := 0 }}
{{ $v2 := 42 }}
{{ with $v1 }}
{{ . }}
{{ else with $v2 }}
{{ . }} → 42
{{ else }}
{{ print "v1 and v2 are falsy" }}
{{ end }}
変数を初期化して、そのスコープは現在のブロック内とします。
{{ with $var := 42 }}
{{ . }} → 42
{{ $var }} → 42
{{ end }}
{{ $var }} → undefined
コンテキストへの理解
ページテンプレートの最上位において、コンテキスト (ドット) は Page
オブジェクトのことです。
with
ブロック内部でのコンテキストは、with
ステートメントにおいて受け渡される値にバインドされます。
以下のような例を見てみます。
{{ with 42 }}
{{ .Title }}
{{ end }}
Hugo は以下のような例外をスローします。
can't evaluate field Title in type int
(フィールド Title は int 型として評価できません)
ここでなぜエラーが発生したかと言えば、.Title
メソッドを Page
オブジェクトに対してではなく整数値に対して適用しようとしたからです。
with
ブロック内部においてページタイトルをレンダリングしたいのであれば、コンテキストをテンプレートに対して受け渡さなければなりません。
以下のテンプレートであれば、ページタイトルを正しくレンダリングしてくれます。
{{ with 42 }}
{{ $.Title }}
{{ end }}
詳しくは Go の text/template ドキュメントを参照してください。