首頁 > 後端開發 > Golang > 如何將多個值從 Go 範本傳遞到嵌套範本?

如何將多個值從 Go 範本傳遞到嵌套範本?

Barbara Streisand
發布: 2024-12-06 14:53:10
原創
463 人瀏覽過

How can I pass multiple values from a Go template to a nested template?

將多個值從模板傳遞到模板

在 Go 模板中,可以使用 {{模板}} 操作。但是,此操作僅接受單一資料值作為輸入。當需要將多個資料實體傳遞給嵌套範本時,需要一個解決方案。

用於資料打包的自訂函數

Go 的範本系統允許使用以下方式註冊自訂函數Template.Funcs() 方法。這些函數可以在資料傳遞到模板之前對資料進行操作,從而實現資料操作和打包。

在需要將多個值傳遞給模板的情況下,可以建立一個自訂函數來包裝將這些值放入單一實體中,例如映射或結構。然後可以將此包裝的實體傳遞給 {{template}} 操作。

範本修改

定義自訂函數後,可以修改範本以呼叫此函數並將包裝的資料實體傳遞給巢狀範本。其語法為:

{{template "templateName" (customFunctionName data1 data2)}}
登入後複製

範例

考慮以下城市和地區結構:

type City struct {
    ID      int
    Name    string
    Regions []Region
}  

type Region struct {
    ID               int
    Name             string
    Shops            []Destination
    Masters          []Master
    EducationCenters []Destination
}
登入後複製

傳遞多個資料實體對於嵌套模板,自訂函數Wrap()可以定義為如下:

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

此函數將商店陣列以及城市和地區名稱包裝到地圖中。修改後的範本現在如下所示:

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}}`
登入後複製

可運行範例

以下程式碼示範如何在實作中使用此解決方案:

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}}`
登入後複製

此程式碼示範如何使用自訂函數將多個資料實體成功傳遞到巢狀範本。

以上是如何將多個值從 Go 範本傳遞到嵌套範本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板