首頁  >  文章  >  後端開發  >  如何偵測 Golang 範本範圍中的最後一個元素?

如何偵測 Golang 範本範圍中的最後一個元素?

Patricia Arquette
Patricia Arquette原創
2024-11-07 13:22:02970瀏覽

How to Detect the Last Element in a Golang Template Range?

偵測範本範圍中的最後一個元素

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn