обнаружить последний элемент в массиве, используя диапазон внутри go-шаблонов - PullRequest
0 голосов
/ 29 апреля 2018

Эта программа выводит просто

1,4,2,

но я бы хотел напечатать

1,4,2.

Как видите, запятая печатается после каждого элемента массива.

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)
}

Есть ли способ изменить {{range $i, $el := .items}}{{$el}},{{end}} и быть уверенным, что последний элемент напечатает "." вместо ","

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

В простом примере, который вы разместили, проще всего написать "fhe": вы можете легко проверить, является ли текущий индекс первым, и вывести запятую после не первых элементов. И, наконец, выведите конечную точку.

Если в более сложном примере вам нужно обнаружить последний элемент, или может случиться так, что список, который вы перебираете, может быть пустым (и, следовательно, конечная точка будет ошибкой), вы можете зарегистрировать пользовательскую функцию, чтобы определить, является ли текущий индекс последним:

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

И используйте следующий шаблон:

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

Тогда будет вывод (попробуйте на Go Playground ):

1,4,2.

Вариантом этого может быть регистрация пользовательской функции, которая вычисляет последний индекс по длине (lastIdx = length - 1), а затем внутри {{range}} вы можете сделать простое сравнение:

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))

Вывод будет таким же. Попробуйте это на игровой площадке Go .

0 голосов
/ 29 апреля 2018

Вы можете использовать

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

чтобы достичь этого. Хитрость заключается в том, чтобы сначала использовать разделитель запятых, но не для первого элемента в диапазоне.

...