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:
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!