Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh menghantar berbilang nilai daripada templat Go kepada templat bersarang?

Bagaimanakah saya boleh menghantar berbilang nilai daripada templat Go kepada templat bersarang?

Barbara Streisand
Barbara Streisandasal
2024-12-06 14:53:10469semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn