템플릿 범위의 마지막 항목 감지
Go 템플릿에서 범위 작업을 사용하여 배열이나 슬라이스를 반복하면 다음에 편리하게 액세스할 수 있습니다. 배열 요소. 그러나 때로는 마지막 반복을 다른 반복과 구별해야 하는 경우도 있습니다.
범위의 마지막 요소에 대해 고유한 형식이 필요한 템플릿을 고려해 보세요.
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
이 템플릿은 출력을 생성합니다. like:
one, two, three
이 동작을 수정하고 마지막 요소 앞에 "and"를 출력하려면:
one, two, and three
범위의 어느 요소가 마지막인지 결정해야 합니다.
템플릿 외부에서 배열 길이를 추적하는 것이 가능하지만 이 방법을 사용하면 배열 길이의 변화를 고려하지 않는 정적 값이 생성됩니다.
해결책은 Go의 함수 주입을 활용하는 데 있습니다. 템플릿 기능. 사용자 정의 함수를 정의하면 마지막 요소를 동적으로 식별하는 것이 가능해집니다.
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) }
이 접근 방식은 리플렉션을 활용하여 배열의 길이를 동적으로 결정하고 이를 현재 인덱스 $i와 비교합니다. 인덱스가 배열 길이에서 1을 뺀 값과 일치하면 마지막 함수는 true를 반환하여 현재 요소가 범위의 마지막 요소임을 나타냅니다.
또는 리플렉션 없이 len 함수를 사용할 수도 있습니다.
package main import ( "os" "text/template" ) func main() { t := template.Must(template.New("abc").Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if len .}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
위 내용은 Go 템플릿 범위에서 마지막 항목을 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!