>  기사  >  백엔드 개발  >  Golang 템플릿 범위에서 마지막 요소를 감지하는 방법은 무엇입니까?

Golang 템플릿 범위에서 마지막 요소를 감지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-07 13:22:02970검색

How to Detect the Last Element in a Golang Template Range?

템플릿 범위의 마지막 요소 감지

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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