Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Melewati Berbilang Nilai Antara Templat Go?

Bagaimanakah Saya Boleh Melewati Berbilang Nilai Antara Templat Go?

Patricia Arquette
Lepaskan: 2024-12-04 14:28:12
asal
239 orang telah melayarinya

How Can I Pass Multiple Values Between Go Templates?

Melalui Berbilang Nilai Antara Templat

Apabila bekerja dengan struktur data kompleks yang melibatkan berbilang jenis bersarang, menghantar berbilang nilai daripada satu templat ke templat yang lain menjadi satu cabaran. Mari kita terokai senario di mana kita mempunyai struktur ini:

  • Struktur bandar: Mengandungi sifat seperti ID, nama dan sepotong struktur Wilayah.
  • Struktur wilayah: Mengandungi ID, nama, dan pelbagai kepingan lain yang mewakili jenis data yang berbeza.

Dalam fungsi utama kami, kami cuba untuk laksanakan templat dengan CityWithSomeData, yang merupakan susunan struktur Bandar:

tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)
Salin selepas log masuk

Melalui Berbilang Nilai dalam Templat

Malangnya, tidak mungkin untuk menghantar berbilang nilai secara langsung dalam templat menggunakan sintaks {{.}}. Menurut dokumentasi teks/templat, sintaks untuk tindakan {{template}} membenarkan hanya satu nilai data pilihan dihantar.

{{template "name"}}
    The template with the specified name is executed with nil data.

{{template "name" pipeline}}
    The template with the specified name is executed with dot set
    to the value of the pipeline.
Salin selepas log masuk

Membungkus Data dalam Nilai Tunggal

Untuk mengatasi pengehadan ini, kami perlu membalut berbilang nilai data kami ke dalam satu nilai yang boleh dihantar sebagai input kepada templat. Walau bagaimanapun, kerana kami tidak boleh menulis kod Go dalam templat, kami akan mencipta fungsi pembungkus tersuai:

func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} {
    return map[string]interface{}{
        "Shops":      shops,
        "CityName":   cityName,
        "RegionName": regionName,
    }
}
Salin selepas log masuk

Fungsi Wrap() ini mengambil tatasusunan nilai Destinasi, bersama-sama dengan nama bandar dan wilayah, dan mengembalikan peta yang menggabungkan semua data ini. Sekarang, kita boleh menggunakan fungsi ini dalam templat kami:

const src = `
{{define "data"}}
    City: {{.CityName}}, Region: {{.RegionName}}, Shops: {{.Shops}}
{{end}}
{{- range . -}}
        {{$city:=.Name}}
        {{- range .Regions -}}
              {{$region:=.Name}}
              {{- template "data" (Wrap .Shops $city $region) -}}
        {{end}}
{{- end}}`
Salin selepas log masuk

Contoh Dikemas Kini

Berikut ialah contoh dikemas kini yang menunjukkan cara fungsi pembungkus digunakan:

t := template.Must(template.New("cities.gohtml").Funcs(template.FuncMap{
    "Wrap": Wrap,
}).Parse(src))
CityWithSomeData := []City{
    {
        Name: "CityA",
        Regions: []Region{
            {Name: "CA-RA", Shops: []Destination{{"CA-RA-SA"}, {"CA-RA-SB"}}},
            {Name: "CA-RB", Shops: []Destination{{"CA-RB-SA"}, {"CA-RB-SB"}}},
        },
    },
    {
        Name: "CityB",
        Regions: []Region{
            {Name: "CB-RA", Shops: []Destination{{"CB-RA-SA"}, {"CB-RA-SB"}}},
            {Name: "CB-RB", Shops: []Destination{{"CB-RB-SA"}, {"CB-RB-SB"}}},
        },
    },
}
if err := t.ExecuteTemplate(os.Stdout, "cities.gohtml", CityWithSomeData); err != nil {
    panic(err)
}
Salin selepas log masuk

Output

City: CityA, Region: CA-RA, Shops: [{CA-RA-SA} {CA-RA-SB}]

City: CityA, Region: CA-RB, Shops: [{CA-RB-SA} {CA-RB-SB}]

City: CityB, Region: CB-RA, Shops: [{CB-RA-SA} {CB-RA-SB}]

City: CityB, Region: CB-RB, Shops: [{CB-RB-SA} {CB-RB-SB}]
Salin selepas log masuk

Oleh membalut berbilang nilai data ke dalam satu peta menggunakan fungsi Wrap(), kami berjaya menghantarnya antara templat dalam aplikasi Go kami.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melewati Berbilang Nilai Antara Templat Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan