Validación de estructuras Go con Govalidator

Validación de estructuras Go con Govalidator

Las estructuras son uno de los tipos de datos principales y de uso popular proporcionados en el lenguaje de programación Go. Muchos paquetes en varias funcionalidades, desde paquetes de base de datos hasta ORM, y algunos marcos web usan estructuras para facilitar el análisis de datos y otras operaciones.

La validación de estructuras es una tarea común en Go, y el paquete de validación de Go proporciona una manera simple y eficiente de validar estructuras en sus proyectos.

¿Qué es el paquete Go Validator?

vista previa de github para el paquete de validación

El paquete de validación de Go implementa validaciones de valor para estructuras y campos individuales en función de las etiquetas especificadas en la declaración de estructuras.

El paquete de validación de Go proporciona funciones para la validación de campos cruzados y de estructuras cruzadas mediante etiquetas, división, matriz y exploración de mapas que permiten niveles de validación de campos multidimensionales, validación de campos personalizados, extracción de nombres de campos personalizados, mensajes de error personalizables y soporte para el popular marco Gin como validador predeterminado para el paquete.

Ejecute uno de estos comandos en la terminal de su directorio de trabajo para instalar el paquete de validación .

go get gopkg.in/go-playground/validator.v9
go get github.com/go-playground/validator/v10

Las versiones son el sufijo de la URL. El primer comando instala la versión 9 y el segundo instala la versión 10 del paquete.

Después de instalar el paquete, puede importarlo a sus proyectos según la versión que haya instalado.

import (
    "gopkg.in/go-playground/validator.v9"
)

Ahora puede proceder a utilizar el paquete de validación de Go. Si hay algún problema con su instalación, intente reinstalar/actualizar a la última versión de Go.

Validación de estructuras con el paquete Validator

Deberá crear una instancia de la estructura validator.Validate , defina la estructura que desea validar usando etiquetas de validación para especificar las reglas de validación para los campos.

Así es como puede crear una instancia de la estructura validator.Validate .

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

Puede definir una estructura que desea validar especificando etiquetas para los campos, estableciendo así reglas de validación. Las etiquetas de validación son anotaciones especiales de definiciones de campos de estructuras que especifican las reglas.

Aquí hay una estructura regular para la validación.

type User struct {
    Name string
    Age int
    Email string
}

Aquí hay un ejemplo de la estructura, lista para la validación.

type User struct {
    Name string `validate:"required"`
    Age int `validate:"gte=0,lte=130"`
    Email string `validate:"required,email"`
}

En este ejemplo, especificó el campo Nombre como obligatorio en la creación de instancias, el campo Edad debe ser mayor o igual a 0 y menor o igual a 130, y el campo Correo electrónico es obligatorio y debe ser una dirección de correo electrónico válida en la creación de instancias.

Hay diferentes etiquetas de validación disponibles en el paquete de validación de Go, incluidas etiquetas para campos obligatorios, valores mínimos y máximos y expresiones regulares. Puede encontrar una lista completa de las etiquetas de validación disponibles en la documentación del paquete del validador Go.

Una vez que haya definido la estructura que desea validar y especificado las reglas de validación para cada campo, puede usar el método Struct del validator.Validate struct para validar la estructura.

user: = User{
    // Name not instantiated
    Age: 3990000,
    Email: "john@example.com",
}
// note that the Name and Age fields fail the validation

err: = validate.Struct(user)
if err! = nil {
    // Struct is invalid
}

El método Struct devuelve un error si existen errores de validación y puede manejar el error en función de su operación.

Puede acceder a estos errores utilizando el método ValidationErrors del error.

if err! = nil {
    for _, err: = range err.(validator.ValidationErrors) {
        fmt.Println(err.Field(), err.Tag())
    }
}

El método ValidationErrors devolverá el nombre de cada campo con un error de validación y la etiqueta de validación que provocó el error.

salida de error

Definición de etiquetas de validación personalizadas

También puede definir etiquetas de validación personalizadas si los requisitos de validación específicos no forman parte de las etiquetas integradas.

Puede utilizar el método RegisterValidation de la estructura validator.Validate . El método RegisterValidation toma dos argumentos; el nombre de la etiqueta de validación y una función de validación. La función de validación es una función de devolución de llamada que se llama para cada campo que tiene la etiqueta de validación personalizada, y la función debe devolver verdadero si el campo es válido y falso en caso contrario.

Aquí hay una definición de ejemplo de una etiqueta de validación personalizada. La etiqueta valida campos para números pares.

validate.RegisterValidation("even", func(fl validator.FieldLevel) bool {
    // Try to get the field value as an int
    value, ok: = fl.Field().Interface().(int)
    if! ok {
        // If the field value is not an int, return false
        return false
    }
    // Return true if the value is even, false, otherwise
    return value % 2 == 0
})

El código define una etiqueta de validación personalizada incluso utilizando el método RegisterValidation de la estructura validator.Validate . Definió la etiqueta de validación usando una función que toma un solo argumento de tipo validator.FieldLevel.

Ahora puede usar la etiqueta de validación personalizada en las definiciones de estructura de la misma manera que lo haría con las etiquetas de validación integradas.

type MyStruct struct {
    Value int `validate:"even"`
}

Hay más para ir Estructuras

Las estructuras son ciudadanos de primera clase en Go, y hay mucho que puedes hacer con las estructuras. Si está familiarizado con los lenguajes puramente orientados a objetos, puede usar las estructuras Go para operar con los datos como lo haría con las clases.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *