Validação de dados em Go: bibliotecas, exemplos e melhores práticas

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): ferramentas, exemplos e melhores práticas



A validação de dados é uma das etapas principais no desenvolvimento de qualquer aplicação web ou API. Em Go (Golang), essa tarefa é resolvida de forma especialmente elegante graças à tipagem forte, bibliotecas poderosas e recursos integrados. Neste artigo, abordaremos as principais abordagens para verificação de dados, bibliotecas populares e forneceremos exemplos práticos de código.



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

Go é compilado para código nativo e não possui um sistema de reflexão embutido como Python ou JavaScript. No entanto, os desenvolvedores criaram várias bibliotecas excelentes que permitem:

  • Verificar campos de estruturas quanto à conformidade com formatos (email, URL, telefone);
  • Definir restrições (min, max, required);
  • Criar validadores personalizados para lógica de negócios;
  • Integrar-se com frameworks web (Gin, Echo, Fiber).


1. Biblioteca go-playground/validator (a mais popular)

go-playground/validator é o padrão de facto para validação de estruturas em Go. Usa tags nos campos das estruturas e suporta mais de 100 regras integradas.



package main

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

type User struct { Name string `validate:"required,min=2,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 _, e := range err.(validator.ValidationErrors) { fmt.Printf("Campo: %s, Erro: %s, Valor: %v", e.Field(), e.Tag(), e.Value()) } }}


Saída:

Campo: Name, Erro: min, Valor: ACampo: Email, Erro: email, Valor: invalid-emailCampo: Age, Erro: gte, Valor: 15


2. Biblioteca ozzo-validation (alternativa com encadeamento de chamadas)

ozzo-validation oferece um estilo mais declarativo sem tags. Adequado para casos em que a estrutura não pode ser modificada ou é necessária validação dinâmica.



package main

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

type Product struct { Name string Price float64}

func main() { p := Product{Name: "", Price: -10} err := validation.ValidateStruct(&p, validation.Field(&p.Name, validation.Required, validation.Length(1, 100)), validation.Field(&p.Price, validation.Required, validation.Min(0.01)), ) if err != nil { fmt.Println(err) }}


3. Validadores personalizados

Frequentemente, é necessária uma verificação não prevista pelas regras integradas. Por exemplo, validação de senha ou unicidade de nome.



package main

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

func passwordValidator(fl validator.FieldLevel) bool { pwd := fl.Field().String() hasUpper := false hasDigit := false for _, ch := range pwd { if unicode.IsUpper(ch) { hasUpper = true } if unicode.IsDigit(ch) { hasDigit = true } } return len(pwd) >= 8 && hasUpper && hasDigit}

type Account struct { Password string `validate:"password"`}

func main() { validate := validator.New() validate.RegisterValidation("password", passwordValidator)

acc := Account{Password: "weak"} err := validate.Struct(acc) if err != nil { fmt.Println("Senha não passou na validação") } else { fmt.Println("Senha correta") }}


4. Validação de requisições HTTP com Gin

O framework Gin usa

Recommendations