{{with pipeline}} T1 {{end}} If the value of the pipeline is empty, no output is generated; otherwise, dot is set to the value of the pipeline and T1 is executed.
テンプレートで条件分岐したい場合 if を利用すれば十分である場合が多そうですが with が有用である例として、人物名に対応するフルーツ名をテンプレート内で取得するような、次のテンプレートを考えてみます。
{{ with $page.Resources.GetMatch $url }} {{ $result = . }} {{ else }} {{ with $page.Resources.Get $url }} {{ $result = . }} {{ else }} {{ with resources.GetMatch $url }} {{ $result = . }} {{ else }} {{ with resources.Get $url }} {{ $result = . }} {{ else }} {{ with resources.GetRemote $url }} {{ $result = . }} {{ end }} {{ end }} {{ end }} {{ end }} {{ end }}
現実問題として、こういうコードを書かざるを得ないが、困っている、というのは Issue としてインパクトがあります。pipeline に関数を利用しており、変数 $url を関数に渡して、結果が存在すればその結果を $result 変数に値を格納しています。こういったケースでは if ではなく with が有用と感じますが Go 1.22 の構文だけですとネストが深くなってしまい、テンプレートのコードが複雑になります。
with else が導入されると上記のテンプレートコードは以下のように書き直せます。シンプルです。#57646 に記載があるこのようなユースケースを考慮して、機能追加は問題ない、としてGo1.23でリリースとなりました。
{{ with $page.Resources.GetMatch $url }} {{ $result = . }} {{ else with $page.Resources.Get $url }} {{ $result = . }} {{ else with resources.GetMatch $url }} {{ $result = . }} {{ else with resources.Get $url }} {{ $result = . }} {{ else with resources.GetRemote $url }} {{ $result = . }} {{ end }}
ちなみに else with が利用できない場合、上記のテンプレートのコードは if を利用して次のように記述できるでしょう。