Validación de datos en Go: revisión de bibliotecas y enfoques

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): bibliotecas y ejemplos prácticos



La validación de datos es uno de los aspectos clave en el desarrollo de aplicaciones web y API robustas en Go. Sin una verificación correcta de los datos entrantes, la aplicación se vuelve vulnerable a errores, entradas incorrectas y ataques. En este artículo, revisaremos tres bibliotecas populares para la validación en Go: go-playground/validator, ozzo-validation y govalidator, y analizaremos ejemplos de su uso.



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

Go es un lenguaje fuertemente tipado, pero esto no evita errores lógicos en los datos: cadenas vacías, correos electrónicos incorrectos, números fuera del rango permitido. La validación permite:

  • Garantizar la integridad de los datos en la entrada;
  • Simplificar el manejo de errores;
  • Aumentar la seguridad de la aplicación;
  • Reducir la cantidad de código repetitivo (boilerplate).


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

La biblioteca más popular (más de 15k estrellas en GitHub). Permite describir reglas de validación directamente en las etiquetas de las estructuras.



Instalación

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


Ejemplo 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, Error: %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 — flexibilidad y legibilidad

La biblioteca ozzo-validation ofrece una interfaz fluida (fluent) para construir reglas. Es ideal para reglas de negocio complejas.



Instalación

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


Ejemplo 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

  • Sin etiquetas: las reglas se escriben en el código;
  • Fácil integración con tipos personalizados;
  • Soporte para validación condicional.


3. govalidator — simplicidad para proyectos pequeños

Biblioteca ligera con un conjunto de funciones listas para validar cadenas, números y estructuras.



Instalación

go get github.com/asaskevich/govalidator


Ejemplo

package main

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

func main() { // Validación de cadenas fmt.Println(govalidator.IsEmail("test@example.com")) // true fmt.Println(govalidator.IsURL("https://pythonlib.ru")) // true fmt.Println(govalid

Recommendations