여러 중첩 유형이 포함된 복잡한 데이터 구조로 작업할 때 한 템플릿에서 다른 템플릿으로 여러 값을 전달하는 것이 어렵습니다. 다음과 같은 구조체가 있는 시나리오를 살펴보겠습니다.
주 함수에서 다음을 사용하여 템플릿을 실행하려고 합니다. 도시 구조의 배열인 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!