Go テンプレートの範囲ループ変数のスコープ
Go テンプレートでは、範囲ループ内で宣言された変数が宣言された変数とどのように相互作用するかを理解することが重要ですループの外で。
次のコードを考えてみましょう。スニペット:
{{ $prevDate := "" }} {{ range $post := .Posts }} {{ if ne $prevDate $post.Date }} <div>
目標は、現在の投稿の日付と前の投稿の日付を比較し、日付が変わったときにセクション ヘッダーを表示することです。ただし、$prevDate の値は、各反復の開始時に空の文字列にリセットされるようです。
問題は、範囲ループ内の変数のスコープにあります。ループの各反復により、新しいシャドウ変数 $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 タイプに追加しますdate:
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}}
これらのソリューションを使用すると、$prevDate 変数は範囲ループの反復にわたってその値を保持できるため、投稿日を効果的に比較できます。
以上がGo テンプレートの範囲ループで変数スコープを適切に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。