2014-03-13 67 views
6

給出的模版最後一項範圍

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

這可輸出

one, two, three 

但是,如果我要輸出

one, two, and three 

我需要知道哪個是上述範圍中的最後一個元素。

我可以設置一個變量來保存數組.SomeField的長度,但這將始終爲3,而上面的$ i值只會達到2.並且您無法從模板中執行算術運算我見過。

是否正在檢測模板範圍內的最後一個值?乾杯。

回答

13

這可能不是最完美的解決方案,但它是最好的我能找到的:

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

+0

謝謝,雖然我一直在尋找的東西更優雅,這似乎是做它目前的方式。我希望golang團隊在某個時候解決這個不足之處。謝謝。 – newfivefour

相關問題