處理涉及多個巢狀類型的複雜資料結構時,將多個值從一個範本傳遞到另一個模板成為一項挑戰。讓我們探討一個具有以下結構的場景:
在我們的main 函數中,我們嘗試使用以下命令執行模板CityWithSomeData,它是City 結構的陣列:
tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)
在模板中傳遞多個值
不幸的是,無法使用{{.}} 語法。根據文字/範本文檔,{{template}} 操作的語法僅允許傳遞一個可選資料值。
{{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.
將資料包裝在單一值中
為了克服這個限制,我們需要將多個資料值包裝成一個可以作為輸入傳遞到模板的值。但是,由於我們無法在模板中編寫Go 程式碼,因此我們將建立一個自訂包裝函數:
func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} { return map[string]interface{}{ "Shops": shops, "CityName": cityName, "RegionName": regionName, } }
此Wrap() 函數採用Destination 值陣列以及城市和地區名稱,並傳回一個結合了所有這些數據的地圖。現在,我們可以在模板中使用此函數:
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}}`
更新的範例
這是一個更新的範例,示範了包裝器函數的用法使用:
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) }
輸出
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}]
透過使用Wrap() 函數將多個資料值包裝到單一映射中,我們成功地將它們在模板之間傳遞我們的 Go 應用程式。
以上是如何在 Go 模板之間傳遞多個值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!