Go テンプレートの範囲ループでの変数のリセット
Go HTML テンプレートでは、変数値を反復にわたって永続化しようとすると、共通の課題が発生します。範囲ループ。変数がループの外で宣言されると、その値が反復ごとにリセットされるように見え、意図した機能が妨げられることがあります。
この現象を理解するために、テンプレート範囲ループの仕組みを詳しく見てみましょう。各反復は独自のスコープ内で動作し、ループ内で再宣言された変数はその特定の反復内でのみ表示されます。これは、ループの外で宣言された変数は、反復内ではアクセスできない、または変更できないことを意味します。
例として、次のテンプレートを考えてみましょう。
{{ $prevDate := "" }} {{ range $post := .Posts }} {{ if ne $prevDate $post.Date }} <div>
最初、$prevDate は、前回の投稿の日付を表示し、if ステートメントでの比較で日付の変更を特定できるようにします。ただし、問題は $prevDate の再宣言が繰り返されることにあります。各反復では新しい変数スコープが作成され、前の変数スコープから効果的に分離されます。その結果、$prevDate は各反復の開始時に初期値 "" にリセットされます。
解決策を見つけるには、テンプレート関数または外部構造体によって提供されるメソッドを利用できます。
解決策 1: 登録されたテンプレート関数
テンプレート関数を定義することで、反復の現在のインデックスを取得し、前の投稿の日付を返します。
func PrevDate(i int) string { if i == 0 { return "" } return posts[i-1].Date }
この関数は、次のようにテンプレートに登録して、その後テンプレートで使用できます。
{{range $index, $post := .Posts}} {{$prevDate := PrevDate $index}} {{end}}
解決策 2:外部構造体メソッド
または、次のようなメソッドを Posts 型に追加することもできます。前の投稿の日付の取得。
type Post struct { // Your Post type Date string } type Posts []Post func (p *Posts) PrevDate(i int) string { if i == 0 { return "" } return (*p)[i-1].Date }
テンプレートでは、次のようにこのメソッドを呼び出すことができます。
{{range $index, $post := .Posts}} {{$prevDate := $.Posts.PrevDate $index}} {{end}}
どちらのソリューションも、範囲の反復にわたって変数値を維持するという課題に効果的に対処します。 Go テンプレートで必要な機能を有効にします。
以上がGo テンプレートの範囲ループで変数のリセットを防ぐ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。