Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menetapkan Semula Pembolehubah dengan Betul dalam Gelung Julat Templat Go?

Bagaimana untuk Menetapkan Semula Pembolehubah dengan Betul dalam Gelung Julat Templat Go?

DDD
DDDasal
2024-12-20 09:18:12602semak imbas

How to Properly Reset Variables in Go Template Range Loops?

Menetapkan Semula Pembolehubah dalam Gelung Julat Templat Go

Dalam gelung julat templat Go, pembolehubah yang diisytiharkan di luar gelung tidak ditetapkan semula pada setiap lelaran. Walau bagaimanapun, mengisytiharkan semula pembolehubah dalam gelung mencipta pembolehubah baharu yang diskop hanya dalam gelung itu, yang berpotensi menyebabkan gelagat yang tidak dijangka.

Pertimbangkan contoh berikut:

{{ $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 }}

Di sini, $prevDate nampaknya set semula kepada rentetan kosong pada permulaan setiap lelaran gelung. Walau bagaimanapun, ini bukan disebabkan oleh mekanisme set semula. Sebaliknya, pembolehubah baharu $prevDate sedang diisytiharkan semula dalam gelung, mengatasi pembolehubah luar.

Penyelesaian

Untuk mengelakkan isu ini, adalah penting untuk menggunakan yang betul skop untuk pembolehubah dalam gelung julat. Terdapat dua penyelesaian yang disyorkan:

Penyelesaian 1: Menggunakan Fungsi Berdaftar

Anda boleh mendaftarkan fungsi yang menerima indeks gelung dan mengembalikan nilai yang dikehendaki daripada gelung sebelumnya lelaran. Contohnya:

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))

Dalam templat anda, anda boleh memanggil fungsi seperti ini:

{{range $index, $post := .Posts}}
    {{$prevDate := PrevDate $index}}
{{end}}

Penyelesaian 2: Menggunakan Kaedah Catatan

Sebagai alternatif, anda boleh menambah kaedah pada jenis Siaran anda yang mengembalikan tarikh sebelumnya. Contohnya:

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
}

Dalam templat anda, anda boleh mengakses kaedah seperti ini:

{{range $index, $post := .Posts}}
    {{$prevDate := $.Posts.PrevDate $index}}
{{end}}

Atas ialah kandungan terperinci Bagaimana untuk Menetapkan Semula Pembolehubah dengan Betul dalam Gelung Julat Templat Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn