ホームページ > バックエンド開発 > Golang > Go テンプレートの範囲ループで変数を適切にリセットするにはどうすればよいですか?

Go テンプレートの範囲ループで変数を適切にリセットするにはどうすればよいですか?

DDD
リリース: 2024-12-20 09:18:12
オリジナル
557 人が閲覧しました

How to Properly Reset Variables in Go Template Range Loops?

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

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