Validação de dados em Go: visão geral de bibliotecas e abordagens

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Validação de dados em Go (Golang): bibliotecas e exemplos práticos



A validação de dados é um dos aspectos-chave do desenvolvimento de aplicações web e APIs confiáveis em Go. Sem a verificação correta dos dados de entrada, a aplicação fica vulnerável a erros, entradas incorretas e ataques. Neste artigo, vamos analisar três bibliotecas populares para validação em Go: go-playground/validator, ozzo-validation e govalidator, além de explorar exemplos de uso.



Por que a validação é necessária em Go?

Go é uma linguagem fortemente tipada, mas isso não a protege de erros lógicos nos dados: strings vazias, emails inválidos, números fora do intervalo permitido. A validação permite:

  • Garantir a integridade dos dados na entrada;
  • Simplificar o tratamento de erros;
  • Aumentar a segurança da aplicação;
  • Reduzir a quantidade de código boilerplate.


1. go-playground/validator — o padrão ouro

A biblioteca mais popular (mais de 15k estrelas no GitHub). Permite descrever regras de validação diretamente nas tags das structs.



Instalação

go get github.com/go-playground/validator/v10


Exemplo básico

package main

import ( "fmt" "github.com/go-playground/validator/v10")

type User struct { Name string `validate:"required,min=3,max=50"` Email string `validate:"required,email"` Age int `validate:"gte=18,lte=120"`}

func main() { validate := validator.New() user := User{ Name: "A", Email: "invalid-email", Age: 15, } err := validate.Struct(user) if err != nil { for _, err := range err.(validator.ValidationErrors) { fmt.Printf("Campo: %s, Erro: %s", err.Field(), err.Tag()) } }}


Validadores personalizados

validate.RegisterValidation("is-valid-username", func(fl validator.FieldLevel) bool {    return len(fl.Field().String()) >= 5})

type Login struct { Username string `validate:"required,is-valid-username"`}


2. ozzo-validation — flexibilidade e legibilidade

A biblioteca ozzo-validation oferece uma interface fluente para construir regras. É adequada para regras de negócio complexas.



Instalação

go get github.com/go-ozzo/ozzo-validation/v4


Exemplo de uso

package main

import ( "fmt" validation "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is")

type Order struct { ProductID string Quantity int Email string}

func (o Order) Validate() error { return validation.ValidateStruct(&o, validation.Field(&o.ProductID, validation.Required, validation.Length(5, 20)), validation.Field(&o.Quantity, validation.Required, validation.Min(1), validation.Max(100)), validation.Field(&o.Email, validation.Required, is.Email), )}

func main() { order := Order{ProductID: "AB", Quantity: 0, Email: "bad"} err := order.Validate() if err != nil { fmt.Println(err) }}


Características

  • Ausência de tags — as regras são escritas no código;
  • Fácil integração com tipos personalizados;
  • Suporte a validação condicional.


3. govalidator — simplicidade para projetos pequenos

Uma biblioteca leve com um conjunto de funções prontas para verificar strings, números e structs.



Instalação

go get github.com/asaskevich/govalidator


Exemplo

package main

import ( "fmt" "github.com/asaskevich/govalidator")

func main() { // Verificação de strings fmt.Println(govalidator.IsEmail("test@example.com")) // true fmt.Println(govalidator.IsURL("https://pythonlib.ru")) // true fmt.Println(govalid

Recommendations