Голанг, разделяющий элементы запятой в шаблоне

Я пытаюсь отобразить список значений, разделенных запятыми, и не хочу отображать запятую после последнего элемента (или единственного элемента, если есть только один).

Мой код:

Equipment:
    {{$equipment := .Equipment}}
    {{ range $index, $element := .Equipment}}
        {{$element.Name}}
        {{if lt $index ((len $equipment) -1)}}
            ,
        {{end}}
    {{end}}

Токовый выход: Equipment: Mat , Dumbbell , Как избавиться от конечной запятой

Ответы

Ответ 1

Хороший трюк, который вы можете использовать:

Equipment:
    {{$equipment := .Equipment}}
    {{ range $index, $element := .Equipment}}
        {{if $index}},{{end}}
        {{$element.Name}}
    {{end}}

Это работает, потому что первый индекс равен 0, который возвращает false в выражении if. Таким образом, этот код возвращает false для первого индекса, а затем помещает запятую перед каждой последующей итерацией. Это приводит к списку, разделенному запятыми, без ведущей или конечной запятой.

Ответ 2

Добавьте функцию шаблона, чтобы сделать работу за вас. strings.Join идеально подходит для вашего случая использования.

Предполагая, что tmpl содержит ваши шаблоны, добавьте функцию Join в ваш шаблон:

tmpl = tmpl.Funcs(template.FuncMap{"StringsJoin": strings.Join})

Шаблон:

Equipment:
    {{ StringsJoin .Equipment ", " }}

площадка

Docs: https://golang.org/pkg/text/template/#FuncMap

Ответ 3

Если вы хотите использовать внешнюю библиотеку, похоже, что в библиотеке sprig есть функция "соединения" (см. здесь):

присоединиться

Объедините список строк в одну строку с указанным разделителем.

list "hello" "world" | join "_"

Приведенное выше приведёт к созданию hello_world

Оператор объединения попытается преобразовать нестандартные значения в строковые:

list 1 2 3 | join "+"

Выше будет 1 + 2 + 3