首頁 >後端開發 >Golang >如何在 Go 模板之間傳遞多個值?

如何在 Go 模板之間傳遞多個值?

Patricia Arquette
Patricia Arquette原創
2024-12-04 14:28:12305瀏覽

How Can I Pass Multiple Values Between Go Templates?

在模板之間傳遞多個值

處理涉及多個巢狀類型的複雜資料結構時,將多個值從一個範本傳遞到另一個模板成為一項挑戰。讓我們探討一個具有以下結構的場景:

  • City 結構:包含 ID、名稱和 Region 結構切片等屬性。
  • Region 結構:包含 ID、名稱、以及代表不同資料類型的各種其他切片。

在我們的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn