템플릿 범위의 마지막 요소 감지
Golang 텍스트 템플릿에서 범위 지시어는 컬렉션의 요소를 반복하고 다음에 대한 액세스를 제공합니다. 현재 요소와 해당 인덱스. 이 메커니즘은 효율적인 루프를 촉진하지만 시퀀스의 마지막 요소를 식별할 때 문제가 됩니다.
문제:
템플릿 고려:
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
기본적으로 이 템플릿은 쉼표로 구분된 요소 목록을 출력합니다.
one, two, three
그러나 최종 요소 앞에 "and"를 추가하여 사람이 읽을 수 있는 출력을 생성하려면 다음을 결정해야 합니다. 범위의 마지막 인덱스입니다.
해결책:
산술 연산은 템플릿에서 직접 지원되지 않지만 해결 방법은 Go의 Reflect 패키지를 사용하는 것입니다.
package main import ( "os" "reflect" "text/template" ) var fns = template.FuncMap{ "last": func(x int, a interface{}) bool { return x == reflect.ValueOf(a).Len() - 1 }, } func main() { t := template.Must(template.New("abc").Funcs(fns).Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if last $i $}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
이 솔루션은 템플릿의 기능 맵 마지막에 Go 기능을 도입합니다. 이 함수는 현재 인덱스와 컬렉션을 인수로 취하고 인덱스가 컬렉션 길이에서 1을 뺀 값과 같으면 true를 반환합니다.
이 함수를 템플릿에 통합하면 마지막 요소를 구별하고 원하는 요소를 출력할 수 있습니다. 결과:
one, two, and three
추가 참고 사항:
대체 접근 방식은 len 함수를 활용하여 반영할 필요 없이 템플릿 내의 컬렉션 길이를 계산하는 것입니다.
{{range $i, $e := .}}{{if $i}}, {{end}}{{if eq $i (len $)}}and {{end}}{{$e}}{{end}}.`
위 내용은 Golang 템플릿 범위에서 마지막 요소를 감지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!