--- title: range description: Iterates over a non-empty collection, binds context (the dot) to successive elements, and executes the block. categories: [] keywords: [] action: aliases: [] related: - functions/go-template/break - functions/go-template/continue - functions/go-template/else - functions/go-template/end returnType: signatures: [range COLLECTION] aliases: [/functions/range] toc: true --- {{% include "functions/go-template/_common/truthy-falsy.md" %}} ```go-html-template {{ $s := slice "foo" "bar" "baz" }} {{ range $s }} {{ . }} → foo bar baz {{ end }} ``` Use with the [`else`] statement: ```go-html-template {{ $s := slice "foo" "bar" "baz" }} {{ range $s }}
{{ . }}
{{ else }}The collection is empty
{{ end }} ``` Within a range block: - Use the [`continue`] statement to stop the innermost iteration and continue to the next iteration - Use the [`break`] statement to stop the innermost iteration and bypass all remaining iterations ## Understanding context At the top of a page template, the [context] (the dot) is a `Page` object. Within the `range` block, the context is bound to each successive element. With this contrived example that uses the [`seq`] function to generate a slice of integers: ```go-html-template {{ range seq 3 }} {{ .Title }} {{ end }} ``` Hugo will throw an error: can't evaluate field Title in type int The error occurs because we are trying to use the `.Title` method on an integer instead of a `Page` object. Within the `range` block, if we want to render the page title, we need to get the context passed into the template. {{% note %}} Use the `$` to get the context passed into the template. {{% /note %}} This template will render the page title three times: ```go-html-template {{ range seq 3 }} {{ $.Title }} {{ end }} ``` {{% note %}} Gaining a thorough understanding of context is critical for anyone writing template code. {{% /note %}} [`seq`]: /functions/collections/seq/ [context]: /getting-started/glossary/#context ## Array or slice of scalars This template code: ```go-html-template {{ $s := slice "foo" "bar" "baz" }} {{ range $s }}{{ . }}
{{ end }} ``` Is rendered to: ```htmlfoo
bar
baz
``` This template code: ```go-html-template {{ $s := slice "foo" "bar" "baz" }} {{ range $v := $s }}{{ $v }}
{{ end }} ``` Is rendered to: ```htmlfoo
bar
baz
``` This template code: ```go-html-template {{ $s := slice "foo" "bar" "baz" }} {{ range $k, $v := $s }}{{ $k }}: {{ $v }}
{{ end }} ``` Is rendered to: ```html0: foo
1: bar
2: baz
``` ## Array or slice of maps This template code: ```go-html-template {{ $m := slice (dict "name" "John" "age" 30) (dict "name" "Will" "age" 28) (dict "name" "Joey" "age" 24) }} {{ range $m }}{{ .name }} is {{ .age }}
{{ end }} ``` Is rendered to: ```htmlJohn is 30
Will is 28
Joey is 24
``` ## Array or slice of pages This template code: ```go-html-template {{ range where site.RegularPages "Type" "articles" }}key = {{ $k }} value = {{ $v }}
{{ end }} ``` Is rendered to: ```go-html-templatekey = age value = 30
key = name value = John
``` Unlike ranging over an array or slice, Hugo sorts by key when ranging over a map. {{% include "functions/go-template/_common/text-template.md" %}} [`else`]: /functions/go-template/else/ [`break`]: /functions/go-template/break/ [`continue`]: /functions/go-template/continue/