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

如何在 Go 模板之間有效率地傳遞多個值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-09 14:09:16311瀏覽

How to Efficiently Pass Multiple Values Between Go Templates?

在Go 中將多個值從一個模板傳遞到另一個模板:綜合指南

如何熟練地將多個值從一個模板傳遞到另一個模板去?考慮提供的上下文:

  • 城市結構:{ID int,名稱字串,區域[]Region}
  • 區域結構:{ID int,名稱字串,商店[]目的地, Masters []Master,EducationCenters []Destination}

在main 函數中,我執行了帶有CityWithSomeData 的範本citys.gohtml:

tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)

在範本中,我的目標是迭代城市和地區以將資料傳遞到另一個範本資料:

{{range .}}
        {{$city:=.Name}}
            {{range .Regions}}
                      {{$region:=.Name}}
                      {{template "data" .Shops $city $region}}
            {{end}}
{{end}}

根據Go 範本文檔, {{template}}操作的語法允許傳遞只有一個可選資料值。要傳遞多個值,我們需要先將它們封裝成單一值,例如映射或結構體。

由於在範本中編寫 Go 程式碼不可行,因此我們可以註冊一個自訂函數來執行此操作任務:

func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} {
    return map[string]interface{}{
        "Shops":      shops,
        "CityName":   cityName,
        "RegionName": regionName,
    }
}

使用 Template.Funcs() 註冊自訂函數。然後,我們修改模板以呼叫Wrap() 函數:

{{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 = [...cities]
if err := t.ExecuteTemplate(os.Stdout, "cities.gohtml", CityWithSomeData); err != nil {
    panic(err)
}

這種方法允許高效傳遞多個值在Go中從一個模板到另一個模板。

以上是如何在 Go 模板之間有效率地傳遞多個值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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