detect last item inside an array using range inside go-templates

一个人想着一个人 提交于 2019-12-19 18:57:30

问题


This program outputs simply

1,4,2,

but I would like to print

1,4,2.

As you can see the comma is printed after each items of an array.

package main

import "os"
import "text/template"

func main() {
    params := map[string]interface{}{
        "items": [3]int{1, 4, 2},
    }
    tpl := "{{range $i, $el := .items}}{{$el}},{{end}}"
    lister, _ := template.New("foo").Parse(tpl)
    lister.Execute(os.Stdout, params)
}

Is there a way to change {{range $i, $el := .items}}{{$el}},{{end}} and be sure that last item will print "." instead of ","


回答1:


You can use

tpl := "{{range $i, $el := .items}}{{if $i}},{{end}}{{$el}}{{end}}."

to achieve that. The trick is to emit the comma separator first, but not for the first item in the range.




回答2:


In the simple example you posted, easiest is what "fhe" posted: you can easily check if the current index is the first, and output a comma after non-first elements. And finally output a trailing dot.

If in a more complicated example you do need to detect the last item, or it may be that the list you iterate over may be empty (and thus the trailing dot would be a mistake), you may register a custom function to tell if the current index is the last:

lister := template.Must(template.New("foo").Funcs(template.FuncMap{
    "IsLast": func(i, size int) bool { return i == size-1 },
}).Parse(tpl))

And use the following template then:

tpl := "{{range $i, $el := .items}}{{$el}}{{if IsLast $i (len $.items)}}.{{else}},{{end}}{{end}}"

Then the output will be (try it on the Go Playground):

1,4,2.

A variation of this could be to register a custom function which calculates the last index from the length (lastIdx = length - 1), and then inside the {{range}} you can do a simple comparison:

tpl := "{{$lastIdx := LastIdx (len .items)}}{{range $i, $el := .items}}{{$el}}{{if eq $lastIdx $i}}.{{else}},{{end}}{{end}}"
lister := template.Must(template.New("foo").Funcs(template.FuncMap{
    "LastIdx": func(size int) int { return size - 1 },
}).Parse(tpl))

Output will be the same. Try it on the Go Playground.



来源:https://stackoverflow.com/questions/50085038/detect-last-item-inside-an-array-using-range-inside-go-templates

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!