Statements
Control flow
Within a templ element, a subset of Go statements can be used directly.
These Go statements can be used to conditionally render child elements, or to iterate variables.
For individual implementation guides see:
if/switch/for within text
Go statements can be used without any escaping to make it simple for developers to include them.
The templ parser assumes that text that starts with if
, switch
or for
denotes the start of one of those expressions as per this example.
package main
templ showHelloIfTrue(b bool) {
<div>
if b {
<p>Hello</p>
}
</div>
}
If you need to start a text block with the words if
, switch
, or for
:
- Use a Go string expression.
- Capitalise
if
,switch
, orfor
.
package main
templ display(price float64, count int) {
<p>Switch to Linux</p>
<p>{ `switch to Linux` }</p>
<p>{ "for a day" }</p>
<p>{ fmt.Sprintf("%f", price) }{ "for" }{ fmt.Sprintf("%d", count) }</p>
<p>{ fmt.Sprintf("%f for %d", price, count) }</p>
}
Design considerations
We decided to not require a special prefix for if
, switch
and for
expressions on the basis that we were more likely to want to use a Go control statement than start a text run with those strings.
To reduce the risk of a broken control statement, resulting in printing out the source code of the application, templ will complain if a text run starts with if
, switch
or for
, but no opening brace {
is found.
For example, the following code causes the templ parser to return an error:
package main
templ showIfTrue(b bool) {
if b
<p>Hello</p>
}
}
Note the missing {
on line 4.
The following code also produces an error, since the text run starts with if
, but no opening {
is found.
package main
templ text(b bool) {
<p>if a tree fell in the woods</p>
}
This also applies to for
and switch
statements.
To resolve the issue:
- Use a Go string expression.
- Capitalise
if
,switch
, orfor
.
package main
templ display(price float64, count int) {
<p>Switch to Linux</p>
<p>{ `switch to Linux` }</p>
<p>{ "for a day" }</p>
<p>{ fmt.Sprintf("%f", price) }{ "for" }{ fmt.Sprintf("%d", count) }</p>
<p>{ fmt.Sprintf("%f for %d", price, count) }</p>
}