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!