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

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

Susan Sarandon
リリース: 2024-12-27 01:14:10
オリジナル
290 人が閲覧しました

How to Properly Manage Variable Scope in Go Templates' Range Loops?

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

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