>백엔드 개발 >Golang >Go 템플릿 간에 여러 값을 효율적으로 전달하는 방법은 무엇입니까?

Go 템플릿 간에 여러 값을 효율적으로 전달하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-09 14:09:16246검색

How to Efficiently Pass Multiple Values Between Go Templates?

Go에서 템플릿 간 여러 값 전달: 종합 가이드

어떻게 하면 한 템플릿에서 다른 템플릿으로 여러 값을 능숙하게 전송할 수 있나요? 가다? 제공된 컨텍스트를 고려하십시오.

  • 도시 구조: {ID int, Name string, Regions []Region}
  • 지역 구조: {ID int, Name string, Shops []Destination, Masters []Master, EducationCenters []Destination}

메인 기능에서 CityWithSomeData가 포함된 city.gohtml 템플릿:

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

템플릿 내에서 도시와 지역을 반복하여 데이터를 다른 템플릿 데이터로 전달하는 것을 목표로 합니다.

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

해결책

Go 템플릿 문서에 따르면 {{template}} 작업의 구문은 다음을 허용합니다. 하나의 선택적 데이터 값만 전달합니다. 여러 값을 전달하려면 먼저 이를 맵이나 구조체와 같은 단일 값으로 캡슐화해야 합니다.

템플릿 내에서 Go 코드를 작성하는 것은 불가능하므로 이를 수행하는 사용자 정의 함수를 등록할 수 있습니다. task:

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으로 문의하세요.