檢測模板範圍中的最後一項
在Go 模板中,使用range 操作迭代數組或切片可以方便地存取數組元素。但是,有時有必要將最後一個迭代與其他迭代區分開來。
考慮一個需要對範圍中的最後一個元素進行不同格式設定的範本:
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
此範本將產生輸出例如:
one, two, three
要修改此行為並在最後一個元素之前輸出「and」:
one, two, and three
需要確定範圍中的哪個元素是最後一個。
雖然可以在模板之外追蹤數組的長度,但這種方法會產生一個靜態值,無法考慮數組長度的變化。
解決方案在於利用 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) }
這種方法利用反射來動態確定數組的長度並將其與當前索引 $i 進行比較。當索引匹配數組長度減一時,last 函數傳回 true,表示當前元素是範圍內的最後一個元素。
作為替代方案,也可以使用不含反射的 len 函數:
package main import ( "os" "text/template" ) func main() { t := template.Must(template.New("abc").Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if len .}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
以上是如何偵測 Go 模板範圍中的最後一項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!