2014-03-13 12 views
6

die Vorlage gegebenletztes Element in einer Golang Vorlage Bereich

{{range $i, $e := .SomeField}} 
     {{if $i}}, {{end}} 
     $e.TheString 
{{end}} 

kann Diesen Ausgang

one, two, three 

Wenn aber ich ausgeben will

one, two, and three 

ich brauchen würde, um wissen, welches das letzte Element im obigen Bereich ist.

Ich kann eine Variable, die die Länge des Arrays enthält .SomeField, aber das wird immer 3, und der $ i Wert oben wird nur immer auf 2. Und Sie können keine Arithmetik in Vorlagen von was durchführen Ich habe gesehen.

Kann der letzte Wert in einem Vorlagenbereich erkannt werden? Prost.

Antwort

13

Dies ist wahrscheinlich nicht die eleganteste Lösung, aber es ist das Beste, was ich finden kann:

http://play.golang.org/p/MT91mLqk1s

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

Hinweis: zu Sie können es auch tun, ohne reflektiert mit der len Funktion (Kredit Russ Cox): http://play.golang.org/p/V94BPN0uKD

cf

+0

Danke, obwohl ich für etwas elegantere anschaute, dies scheint die Art und Weise, um es zur Zeit zu tun. Ich hoffe, dass das Golang-Team irgendwann diese Unzulänglichkeit beseitigt. Vielen Dank. – newfivefour