Реализуйте цикл 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 }}