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
Patricia Arquetteasal
2024-12-04 14:28:12242semak imbas

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)

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.

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,
    }
}

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}}`

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

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}]

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!

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