19

テンプレートを考えると:

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

これは以下を出力できます:

one, two, three

ただし、出力したい場合:

one, two, and three

上記の範囲の最後の要素がどれかを知る必要があります。

配列の長さを保持する変数を設定できますが.SomeField、それは常に 3 になり、$i上記の値は 2 にしかなりません。

テンプレート範囲の最後の値を検出できますか? 乾杯。

4

4 に答える 4

20

これはおそらく最もエレガントなソリューションではありませんが、私が見つけることができる最高のものです:

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

注:関数を使用して反映せずに実行することもできlenます (Russ Cox の功績): http://play.golang.org/p/V94BPN0uKD

cf

于 2014-03-13T10:02:26.043 に答える