Go テンプレートの範囲ループの変数: 反復時にリセットされますか?
Go テンプレートでは、範囲ループの外で宣言された変数はリセットされません反復ごとに。ただし、ループ内の変数に新しい値を割り当てるときに問題が発生します。
次のコードを考えてみましょう:
{{ $prevDate := "" }} {{ range $post := .Posts }} {{ if ne $prevDate $post.Date }} <div>
目的は、$prevDate を現在の投稿の日付と比較することです。投稿が同じ日に行われたかどうかを判断します。ただし、$prevDate は各ループ反復の開始時に空の文字列にリセットされるようです。
この動作の理由は、変数 $prevDate がループ内で再宣言されているためです。これにより、現在の反復内のスコープ内にのみ含まれる新しい変数が作成されます。元の $prevDate 変数は、ループの外では変更されません。
この問題を解決するには、次の 2 つの解決策が考えられます。
解決策 #1: 登録された関数を使用する
現在のインデックスを取得し、前の投稿を返すカスタム関数を登録できます。 date:
func PrevDate(i int) string { if i == 0 { return "" } return posts[i-1].Date }
次に、テンプレート内:
{{range $index, $post := .Posts}} {{$prevDate := PrevDate $index}} ... {{end}}
解決策 2: 投稿メソッドを使用する
または、投稿タイプにメソッドを追加できます:
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 テンプレートの範囲ループ変数は反復ごとにリセットされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。