偵測範本範圍中的最後一個元素
在Golang 文字範本中,range 指令迭代中的元素並提供目前元素及其索引。雖然這種機制有助於高效循環,但在識別序列中的最後一個元素時卻提出了挑戰。
問題:
考慮一個範本:
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
預設情況下,此範本將輸出以逗號分隔的元素清單:
one, two, three
但是,要產生最終元素前面帶有「and」的人類可讀輸出,我們需要確定range 的最後一個索引。
解決方案:
雖然模板中不直接支援算術運算,但解決方法涉及使用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) }
此解決方案在模板的函數映射的最後引入了Go 函數。此函數以目前索引和集合作為參數,如果索引等於集合長度減一,則傳回 true。
將此函數合併到模板中,我們可以區分最後一個元素並輸出所需的內容結果:
one, two, and three
附加說明:
另一種方法是使用len 函數來計算模板中集合的長度,而不需要反射:
{{range $i, $e := .}}{{if $i}}, {{end}}{{if eq $i (len $)}}and {{end}}{{$e}}{{end}}.`
以上是如何偵測 Golang 範本範圍中的最後一個元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!