Validación de datos en Go (Golang): bibliotecas, enfoques y ejemplos de código

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Validación de datos en Go (Golang): guía completa sobre bibliotecas y enfoques



La validación de datos es una parte críticamente importante de cualquier aplicación web, API o microservicio. En Go (Golang), esta tarea se resuelve tanto con herramientas estándar como con potentes bibliotecas de terceros. En este artículo, analizaremos los enfoques principales, las bibliotecas populares y proporcionaremos ejemplos prácticos de código.



¿Por qué es necesaria la validación en Go?

Go es un lenguaje fuertemente tipado, lo que ya proporciona cierta protección contra datos incorrectos. Sin embargo, los tipos no verifican las reglas de negocio: el email debe contener «@», la edad debe estar en el rango de 0 a 120, la contraseña debe tener una longitud mínima. Sin validación, corre el riesgo de obtener:

  • Inyecciones SQL y ataques XSS
  • Datos incorrectos en la base de datos
  • Pánicos inesperados y errores en tiempo de ejecución


Herramientas de validación integradas

La validación más simple se hace «a mano» en funciones. Ejemplo:

type User struct {    Name  string    Email string    Age   int}

func ValidateUser(u User) error { if u.Name == "" { return errors.New("name is required") } if !strings.Contains(u.Email, "@") { return errors.New("invalid email") } if u.Age < 0 || u.Age > 150 { return errors.New("age must be between 0 and 150") } return nil}

Este enfoque es simple, pero para estructuras complejas se vuelve voluminoso y difícil de mantener. Por eso, la comunidad de Go creó bibliotecas especializadas.



1. go-playground/validator — el estándar de facto

Enlace: github.com/go-playground/validator/v10

Esta es la biblioteca de validación más popular en Go (más de 15k estrellas en GitHub). Utiliza etiquetas de estructura (struct tags) para describir reglas de forma declarativa.



Instalación

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


Ejemplo de uso

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=0,lte=150"` Password string `validate:"required,min=8"`}

func main() { validate := validator.New()

user := User{ Name: "A", Email: "not-email", Age: 200, Password: "123", }

err := validate.Struct(user) if err != nil { for _, e := range err.(validator.ValidationErrors) { fmt.Printf("Campo: %s, regla: %s, valor: %v", e.Field(), e.Tag(), e.Value()) } }}


Salida:

Campo: Name, regla: min, valor: ACampo: Email, regla: email, valor: not-emailCampo: Age, regla: lte, valor: 200Campo: Password, regla: min, valor: 123


Etiquetas-regla populares

  • required — campo obligatorio
  • min, max — para números y cadenas
  • len — longitud exacta
  • email — verificación de email
  • url — verificación de URL
  • gte, lte — mayor/menor o igual
  • oneof — uno de los valores (oneof=admin user)


Validadores personalizados

validate.RegisterValidation("is-odd", func(fl validator.FieldLevel) bool {    return fl.Field().Int()%2 != 0})

type MyStruct struct { Number int `validate:"is-odd"`}


2. ozzo-validation — alternativa con cadenas

Enlace: github.com/go-ozzo/ozzo-validation/v4

Esta biblioteca ofrece un enfoque más «Go-idomático»: las reglas se definen mediante funciones, no etiquetas. Esto proporciona mayor flexibilidad y legibilidad.



Ejemplo

package main

import ( "fm

Recommendations