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

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

DDD
DDDオリジナル
2024-12-20 09:18:12554ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。