私は初心者の Go (および Go テンプレート) のアマチュア プログラマーであり、この質問のバリエーションが尋ねられているのを見てきましたが、まったく同じ方法ではなかったので、ここでもう一度言います...
追加の関数を登録せずに次のことを試みています(そのため、制限されたテンプレート構文で許可されているものに厳密に制限しています):
HTML のいくつかの異なるスニペットがあり、それぞれが独自のテンプレートを持っているA.tpl
とB.tpl
しC.tpl
ます。例が示すようにサブテンプレート)。
次に、共通のヘッダー、フッター、メニューなどを設定するメイン テンプレートと、それぞれを囲む必要な HTML を で作成しますmain.tpl
。次のような非常に単純なものです。
{{ if .A }}
{{ template "A.tpl" . }}
{{ end }}
{{ if .B }}
{{ template "B.tpl" . }}
{{ end }}
{{ if .C }}
{{ template "C.tpl" . }}
{{ end }}
...
または、呼び出しコードがどのように行われたかによって、これは次のように書くこともできます (サブテンプレートの名前を値として に渡すと仮定しますmain.tpl
):
{{ if eq .SubTemplate "A.tpl" }}
{{ template "A.tpl" . }}
{{ end }}
{{ if eq .SubTemplate "B.tpl" }}
{{ template "B.tpl" . }}
{{ end }}
{{ if eq .SubTemplate "C.tpl" }}
{{ template "C.tpl" . }}
{{ end }}
...
明らかに、(テンプレート レベルで) 書くことが明らかなのは次のようなものです。
{{ template .SubTemplate . }}
しかしもちろん、それは構文的に無効template
です。パラメータとして値/変数ではなく、文字列定数しか使用できないためです (右?)
テンプレートのステートメントの長いリストを強制する背後にある理由はif
、この種のプログラミング スタイルは、少なくとも言語の「標準」レベルでは、テンプレートから取り出されるべき「ロジック」と見なされるためのようです。Go プログラマーは、テンプレート エンジン (= プレゼンテーション層) に固有の「ロジック」があると考えてはいけません。もちろん、何がロジックと見なされ、何がそうでないかを議論するのは私次第ではありません (if
特定の値が等しいかどうかをテストし、それらの値に応じて異なるブロックを実行するステートメントは、私にとって最も確実に「ロジック」ですが、どうやら Go 開発者向けではありません)。
数年前にも同様の質問がありましたが、その答えは OP にとって決して満足のいくものではありませんでした。基本的に、私が理解している限り、いくつかの選択肢があります。
- テンプレート コードを拡張して、最終的に同等の switch ステートメントを作成する新しい関数を定義します。これにより、少なくともいくつかの
{{ if ... end }}
構造を節約できますが、私にとっては、ワンライナーの単純さと読みやすさにはまだ欠けています。 html/template
テンプレートの構文を変更するためにパッケージ全体をハッキング (または、拡張...) します。これは、 4 年前に @Intermernet によって行われたとされています。もちろん、これは有効な演習ですが、標準の Go ライブラリから離れることを意味します。それが選択である場合、そこには Go 用のテンプレート エンジンがたくさんあります。そのうちの 1 つを使い始めるのは気が進まないのですが、数年後には、作成者がプロジェクトを放棄したため、それが時代遅れになっていることに気付きました。標準ライブラリでは、(少なくとも Google が存在し、Ken Thompsonがまだ生きている間は) 発生しません。- Go 側で使用するサブテンプレートのすべての処理を行います。これは当然実現可能ですが、(IMHO) コードが読みにくくなります。もちろん、私は Go プログラマーの間、「慣用的な」(しかし従うのが難しい) コードを書くことに熱心な人々と、Go コードを書くさまざまな方法を持つ他の多くの派閥との間のイデオロギーの戦いを認識しています。個人的に、私は最小のサプライズとキスの原則を守っています— 私は自分のコードを書いてから 10 年後でも理解できるようにしたいと思っています :)
テンプレートの構文は、私が説明したことを可能にする方向に進化したのでしょうか (実際に機能する例が見つからなかったのは残念でした)、それとも Go コードを複雑にするか、別の非標準の Go テンプレート エンジンを使用することにまだこだわっていますか?この単純なタスクを達成するには?
ご意見をお寄せいただきありがとうございます。私はまだGoテンプレート構文の初心者であり、実際に私が望むものを許可することを望んでいます.template
キーワードが変数を受け入れられるようにするために、いくつかの厄介な記号を追加する必要があります.文字列定数の代わりに、これまでのところ私を逃してきた何か:-)