Templates 02 - Condicionais
Templates Condicionais
Outro recurso muito frequente que precisamos quando estamos trabalhando com templates é a utilização de condições.
Para todos os exemplos de condicionais nesse artigo, vamos utilizar esse trecho de código:
type User struct {
Name string
LastName string
Country string
Admin bool
YearsOfExperience int
}
func main() {
tmplFile := "conditional.tmpl"
users := []User{
{"John", "Doe", "USA", true, 25},
{"Gavin", "Steele", "USA", false, 3},
{"Ashton", "Walsh", "CA", false, 5},
}
tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, users)
if err != nil {
panic(err)
}
}
Por exemplo, se precisarmos imprimir Admin User ou Regular User dependendo do valor do campo Admin da struct User, podemos criar um template dessa forma:
O nome do template será conditional.tmpl, esse é o conteúdo do template:
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}
User Tye: {{ if .Admin }}Admin User{{ else }}Regular User{{ end }}
{{ end }}
----------
Name: John LastName: Doe Country: USA
User Type: Admin User
----------
Name: Gavin LastName: Steele Country: USA
User Type: Regular User
----------
Name: Ashton LastName: Walsh Country: CA
User Type: Regular User
O campo Admin da struct é um booleano, então podemos verificar se ele é verdadeiro com o marcador {{ if .Admin }}.
Devemos inserir o marcador {{ end }} após o marcador {{ if }}, nesse exemplo estamos utilizando o marcado {{ else }} para imprimir que é um usuário comum, mas poderíamos ter somente um if sem else:
{{ range . }}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}
{{ if .Admin }}User Type: Admin User{{ end }}
{{ end }}
----------
Name: John LastName: Doe Country: USA
User Type: Admin User
----------
Name: Gavin LastName: Steele Country: USA
----------
Name: Ashton LastName: Walsh Country: CA
Podemos inserir o sinal de menos - para remover espaços em brancos e quebra de linhas que não queremos, dessa forma, podemos inserir quebras de linha manualmente com “\n”.
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if .Admin }}User Type: Admin User{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
User Type: Admin User
----------
Name: Gavin LastName: Steele Country: USA
----------
Name: Ashton LastName: Walsh Country: CA
----------
Mais de um condição
Quando temos que comparar mais de uma condição, podemos utilizar a função and.
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if (and (.Admin) (eq .Name "John")) }}John Admin{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
John Admin
----------
Name: Gavin LastName: Steele Country: USA
----------
Name: Ashton LastName: Walsh Country: CA
----------
No exemplo acima utilizamos if em conjunto com a função and que irá avaliar se os dois argumentos fornecidos são nulos.
Primeiro conferimos se .Admin é verdadeiro e em seguida utilizamos a função eq para comparar o campo .Name é igual à string John.
As funções que temos para realizarmos comparações que são:
- eq igual
- ne diferente
- lt menor que
- le menor ou igual
- gt maior que
- ge maior ou igual
eq
Igual
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if (and (.Admin) (eq .Name "John")) }}John Admin{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
John Admin
----------
Name: Gavin LastName: Steele Country: USA
----------
Name: Ashton LastName: Walsh Country: CA
----------
ne
Diferente
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if ne .Name "John" }}Not John{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
----------
Name: Gavin LastName: Steele Country: USA
Not John
----------
Name: Ashton LastName: Walsh Country: CA
Not John
----------
lt
Menor que
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if lt .YearsOfExperience 5 }}Less than 5 years of experience{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
----------
Name: Gavin LastName: Steele Country: USA
Less than 5 years of experience
----------
Name: Ashton LastName: Walsh Country: CA
----------
le
Menor ou igual
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if le .YearsOfExperience 5 }}Less than or equal to 5 years of experience{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
----------
Name: Gavin LastName: Steele Country: USA
Less than or equal to 5 years of experience
----------
Name: Ashton LastName: Walsh Country: CA
Less than or equal to 5 years of experience
----------
gt
Maior que
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if gt .YearsOfExperience 5 }}Greater than 5 years of experience{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
Greater than 5 years of experience
----------
Name: Gavin LastName: Steele Country: USA
----------
Name: Ashton LastName: Walsh Country: CA
----------
ge
Maior ou igual
{{ range . -}}
----------
Name: {{ .Name }} LastName: {{ .LastName }} Country: {{ .Country }}{{ "\n" }}
{{- if ge .YearsOfExperience 5 }}Greater than or equal to 5 years of experience{{ "\n" }}{{ end -}}
{{ end -}}
----------
----------
Name: John LastName: Doe Country: USA
Greater than or equal to 5 years of experience
----------
Name: Gavin LastName: Steele Country: USA
----------
Name: Ashton LastName: Walsh Country: CA
Greater than or equal to 5 years of experience
----------