Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh menghantar berbilang nilai daripada templat Go kepada templat bersarang?
Melalui Berbilang Nilai daripada Templat ke Templat
Dalam templat Go, adalah mungkin untuk menghantar nilai data kepada templat bersarang menggunakan {{ templat}} tindakan. Walau bagaimanapun, tindakan ini hanya menerima satu nilai data sebagai input. Apabila berbilang entiti data perlu dihantar ke templat bersarang, penyelesaian diperlukan.
Fungsi Tersuai untuk Pembungkusan Data
Sistem templat Go membenarkan pendaftaran fungsi tersuai menggunakan Kaedah Template.Funcs(). Fungsi ini boleh melakukan operasi pada data sebelum ia dihantar ke templat, membenarkan manipulasi dan pembungkusan data.
Dalam kes di mana berbilang nilai perlu dihantar ke templat, fungsi tersuai boleh dibuat untuk membalut nilai ini menjadi satu entiti, seperti peta atau struct. Entiti yang dibalut ini kemudiannya boleh diserahkan kepada tindakan {{template}}.
Pengubahsuaian Templat
Setelah fungsi tersuai ditakrifkan, templat boleh diubah suai untuk memanggil fungsi ini dan hantar entiti data yang dibalut ke templat bersarang. Sintaks untuk ini ialah:
{{template "templateName" (customFunctionName data1 data2)}}
Contoh
Pertimbangkan struct Bandar dan Wilayah berikut:
type City struct { ID int Name string Regions []Region } type Region struct { ID int Name string Shops []Destination Masters []Master EducationCenters []Destination }
Untuk menghantar berbilang entiti data kepada templat bersarang, fungsi tersuai Wrap() boleh ditakrifkan sebagai berikut:
func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} { return map[string]interface{}{ "Shops": shops, "CityName": cityName, "RegionName": regionName, } }
Fungsi ini membungkus tatasusunan kedai dan nama bandar dan wilayah ke dalam peta. Templat yang diubah suai kini kelihatan seperti ini:
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 Boleh Dijalankan
Kod berikut menunjukkan cara penyelesaian ini boleh digunakan dalam amalan:
package main import ( "os" "text/template" ) type City struct { ID int Name string Regions []Region } type Region struct { ID int Name string Shops []Destination Masters []Master EducationCenters []Destination } type Destination struct { Name string } func main() { 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) } } 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}}`
Kod ini menunjukkan kejayaan menghantar berbilang entiti data ke templat bersarang menggunakan fungsi tersuai.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menghantar berbilang nilai daripada templat Go kepada templat bersarang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!