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
----------