--- title: range description: Iterates over a non-empty collection, binds context (the dot) to successive elements, and executes the block. categories: [] keywords: [] params: functions_and_methods: aliases: [] returnType: signatures: [range COLLECTION] aliases: [/functions/range] --- The collection may be a slice, a map, or an integer. ```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](g) (the dot) is a `Page` object. Within the `range` block, the context is bound to each successive element. With this contrived example: ```go-html-template {{ $s := slice "foo" "bar" "baz" }} {{ range $s }} {{ .Title }} {{ end }} ``` Hugo will throw an error: ```text can't evaluate field Title in type int ``` The error occurs because we are trying to use the `.Title` method on a string 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. This template will render the page title three times: ```go-html-template {{ $s := slice "foo" "bar" "baz" }} {{ range $s }} {{ $.Title }} {{ end }} ``` > [!note] > Gaining a thorough understanding of context is critical for anyone writing template code. ## Examples ### 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
``` ### 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
``` ### 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. ### Integers {{< new-in 0.123.0 />}} Ranging over a positive integer `n` executes the block `n` times, with the context starting at zero and incrementing by one in each iteration. ```go-html-template {{ $s := slice }} {{ range 1 }} {{ $s = $s | append . }} {{ end }} {{ $s }} → [0] ``` ```go-html-template {{ $s := slice }} {{ range 3 }} {{ $s = $s | append . }} {{ end }} {{ $s }} → [0 1 2] ``` Ranging over a non-positive integer executes the block zero times. {{% include "/_common/functions/go-template/text-template.md" %}} [`break`]: /functions/go-template/break/ [`continue`]: /functions/go-template/continue/ [`else`]: /functions/go-template/else/