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/v10Ejemplo 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: 123Etiquetas-regla populares
required— campo obligatoriomin,max— para números y cadenaslen— longitud exactaemail— verificación de emailurl— verificación de URLgte,lte— mayor/menor o igualoneof— 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 También en la biblioteca
Generación de informes PDF en C# (.NET) con iTextSharp y QuestPDF
Tokens JWT en Swift: guía completa para trabajar con JSON Web Tokens
Generación de informes PDF en C++ con libharu y PoDoFo
OpenAI SDK para JavaScript (Node.js): guía completa con ejemplos
SwiftyUserDefaults para Swift: guía completa con ejemplos