>백엔드 개발 >Golang >Go 템플릿 간에 여러 값을 어떻게 전달할 수 있나요?

Go 템플릿 간에 여러 값을 어떻게 전달할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-04 14:28:12242검색

How Can I Pass Multiple Values Between Go Templates?

템플릿 간에 여러 값 전달

여러 중첩 유형이 포함된 복잡한 데이터 구조로 작업할 때 한 템플릿에서 다른 템플릿으로 여러 값을 전달하는 것이 어렵습니다. 다음과 같은 구조체가 있는 시나리오를 살펴보겠습니다.

  • 도시 구조체: ID, 이름 및 지역 구조 조각과 같은 속성을 포함합니다.
  • 지역 구조체: ID, 이름, 그리고 다양한 데이터 유형을 나타내는 다양한 조각.

주 함수에서 다음을 사용하여 템플릿을 실행하려고 합니다. 도시 구조의 배열인 CityWithSomeData:

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

템플릿에서 여러 값 전달

안타깝게도 다음을 사용하여 템플릿에서 여러 값을 직접 전달할 수는 없습니다. {{.}} 구문. 텍스트/템플릿 문서에 따르면 {{template}} 작업의 구문에서는 하나의 선택적 데이터 값만 전달할 수 있습니다.

{{template "name"}}
    The template with the specified name is executed with nil data.

{{template "name" pipeline}}
    The template with the specified name is executed with dot set
    to the value of the pipeline.

단일 값으로 데이터 래핑

이러한 제한을 극복하려면 여러 데이터 값을 템플릿에 입력으로 전달할 수 있는 단일 값으로 래핑해야 합니다. 그러나 템플릿에 Go 코드를 작성할 수 없기 때문에 사용자 정의 래퍼 함수를 ​​생성하겠습니다.

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

이 Wrap() 함수는 도시 및 지역 이름과 함께 Destination 값의 배열을 사용합니다. 이 모든 데이터를 결합한 지도를 반환합니다. 이제 템플릿에서 이 함수를 사용할 수 있습니다.

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

업데이트된 예

다음은 래퍼 함수가 어떻게 작동하는지 보여주는 업데이트된 예입니다. 사용:

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

출력

City: CityA, Region: CA-RA, Shops: [{CA-RA-SA} {CA-RA-SB}]

City: CityA, Region: CA-RB, Shops: [{CA-RB-SA} {CA-RB-SB}]

City: CityB, Region: CB-RA, Shops: [{CB-RA-SA} {CB-RA-SB}]

City: CityB, Region: CB-RB, Shops: [{CB-RB-SA} {CB-RB-SB}]

Wrap() 함수를 사용하여 여러 데이터 값을 단일 맵으로 래핑하여 템플릿 간에 성공적으로 전달했습니다. Go 애플리케이션을 소개합니다.

위 내용은 Go 템플릿 간에 여러 값을 어떻게 전달할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.