Реализуйте цикл for внутри шаблона golang

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

Как я могу использовать цикл for внутри шаблона Golang?

Мне нужно сгенерировать последовательность чисел внутри шаблона. У меня нет массива для повторения.

РЕДАКТИРОВАТЬ: Мне нужно получить что-то вроде этого:

<select>
     <option value="1">1</option>
     <option value="2">2</option>
     <option value="3">3</option>
     <option value="4">4</option>
</select>

Итак, мне нужно сделать в коде что-то вроде:

<select>
     {{for i := 1; i < 5; i++}}
        <option value="{{i}}">{{i}}</option>
     {{end}}
</select>

Но это не работает

4 ответа

Ты можешь использовать range в шаблонах. См. https://golang.org/pkg/text/template/.

Самый простой вариант - просто использовать фрагмент, содержащий ваши параметры:

func main() {
    const tmpl = `
<select>
{{range $val := .}}
     <option value="{{$val}}">{{$val}}</option>
{{end}}
</select>
`
    t := template.Must(template.New("tmpl").Parse(tmpl))

    t.Execute(os.Stdout, []int{1, 2, 3})
}

Лучше всего добавить функцию "Итерировать" в ваш func_map.

template.FuncMap{
        "Iterate": func(count *uint) []uint {
            var i uint
            var Items []uint
            for i = 0; i < (*count); i++ {
                Items = append(Items, i)
            }
            return Items
        },
    }
}

Как только вы зарегистрируете свою карту функций с текстом / шаблоном, вы можете выполнить итерации следующим образом:

{{- range $val := Iterate 5 }}
  {{ $val }}
{{- end }}

Я не знаю, почему эта полезная функция не является частью набора функций по умолчанию, который предоставляет текст / шаблон. Может быть, они добавят что-то подобное в будущем.

Вы также можете использовать канал, чтобы избежать построения среза:

      funcMap := template.FuncMap{
    "loop": func(from, to int) <-chan int {
        ch := make(chan int)
        go func() {
            for i := from; i <= to; i++ {
                ch <- i
            }
            close(ch)
        }()
        return ch
    },
}

затем:

      {{range $x := loop 3 9 }}
Hey {{$x}}!
{{- end}}

См. полный рабочий пример: https://go.dev/play/p/DP2WuROnCC9.

Вы можете использовать seq с участием rangeПример выполнения итерации для 20 циклов

{{ range $index, $num := (seq 20) }}
$indexStartingAt1 := (add $index 1)
{{ end }}
Другие вопросы по тегам