Go テンプレート範囲ループでの変数のリセット
Go テンプレート範囲ループでは、ループの外で宣言された変数は各反復でリセットされません。ただし、ループ内で変数を再宣言すると、そのループ内のみをスコープとする新しい変数が作成され、予期しない動作が発生する可能性があります。
次の例を考えてみましょう。
{{ $prevDate := "" }} {{ range $post := .Posts }} {{ if ne $prevDate $post.Date }} <div class="post-date">Posts dated: {{ $post.Date }}</div> {{ end }} <div class="post-content">{{ $post.Content }}</div> {{ $prevDate := $post.Date }} {{ end }}
ここで、$prevDate は次のようになります。各ループ反復の開始時に空の文字列にリセットされます。ただし、これはリセットメカニズムによるものではありません。代わりに、新しい変数 $prevDate がループ内で再宣言され、外部変数をオーバーライドします。
解決策
この問題を回避するには、正しい変数を利用することが重要です。範囲ループ内の変数のスコープ。推奨される解決策は 2 つあります。
解決策 1: 登録された関数を使用する
ループ インデックスを受け取り、前のループから目的の値を返す関数を登録できます。反復。例:
func PrevDate(i int) string { if i == 0 { return "" } return posts[i-1].Date } // Registering the function: var yourTempl = template.Must(template.New(""). Funcs(map[string]interface{}{"PrevDate": PrevDate}). Parse(yourStringTemplate))
テンプレートで、次のように関数を呼び出すことができます:
{{range $index, $post := .Posts}} {{$prevDate := PrevDate $index}} {{end}}
解決策 2: Posts メソッドを使用する
また、前の日付を返すメソッドを 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 テンプレートの範囲ループで変数を適切にリセットするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。