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
Lepaskan: 2024-12-06 14:53:10
asal
492 orang telah melayarinya

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:

1

{{template "templateName" (customFunctionName data1 data2)}}

Salin selepas log masuk

Contoh

Pertimbangkan struct Bandar dan Wilayah berikut:

1

2

3

4

5

6

7

8

9

10

11

12

13

type City struct {

    ID      int

    Name    string

    Regions []Region

 

type Region struct {

    ID               int

    Name             string

    Shops            []Destination

    Masters          []Master

    EducationCenters []Destination

}

Salin selepas log masuk

Untuk menghantar berbilang entiti data kepada templat bersarang, fungsi tersuai Wrap() boleh ditakrifkan sebagai berikut:

1

2

3

4

5

6

7

func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} {

    return map[string]interface{}{

        "Shops":      shops,

        "CityName":   cityName,

        "RegionName": regionName,

    }

}

Salin selepas log masuk

Fungsi ini membungkus tatasusunan kedai dan nama bandar dan wilayah ke dalam peta. Templat yang diubah suai kini kelihatan seperti ini:

1

2

3

4

5

6

7

8

9

10

11

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}}`

Salin selepas log masuk

Contoh Boleh Dijalankan

Kod berikut menunjukkan cara penyelesaian ini boleh digunakan dalam amalan:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

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}}`

Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan