ホームページ > バックエンド開発 > Golang > Go テンプレートの範囲ループ変数は反復ごとにリセットされますか?

Go テンプレートの範囲ループ変数は反復ごとにリセットされますか?

DDD
リリース: 2024-12-21 02:20:10
オリジナル
874 人が閲覧しました

Do Go Template Range Loop Variables Reset on Each Iteration?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート