Как в Go сделать нормально валидацию?

В Go есть несколько популярных подходов для реализации валидации данных. Есть несколько библиотек, которые помогают справиться с этой задачей, а также можно создать собственные инструменты валидации на основе встроенных возможностей языка.

Одним из распространенных подходов является использование структур и аннотаций валидации для полей структур. Библиотеки, такие как go-playground/validator или govalidator, позволяют определить правила валидации для полей структур, такие как обязательные поля, форматы даты, числовые диапазоны и другие. Это позволяет легко проверять данные перед их использованием.

Пример использования библиотеки go-playground/validator:

package main

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

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

func main() {
    user := User{
        Name:  "John Doe",
        Email: "[email protected]",
        Age:   25,
    }

    validate := validator.New()
    err := validate.Struct(user)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("User data is valid")
    }
}

В этом примере определена структура User с полями Name, Email и Age. С помощью аннотаций validate указываются правила валидации для каждого поля. Затем создается экземпляр валидатора с помощью функции New() из пакета github.com/go-playground/validator/v10. Метод Struct() выполняет валидацию структуры user и возвращает ошибку, если данные не прошли валидацию.

Еще один способ реализации валидации данных в Go - использование функций валидации. Вы можете создать отдельные функции для валидации каждого поля и вызывать их при необходимости. Например:

package main

import (
    "fmt"
    "regexp"
)

func validateName(name string) error {
    if name == "" {
        return fmt.Errorf("Name is required")
    }
    return nil
}

func validateEmail(email string) error {
    // использование regexp для проверки формата email
    validEmail := regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}$`)
    if !validEmail.MatchString(email) {
        return fmt.Errorf("Invalid email address")
    }
    return nil
}

func main() {
    name := "John Doe"
    email := "[email protected]"

    err := validateName(name)
    if err != nil {
        fmt.Println(err)
    }

    err = validateEmail(email)
    if err != nil {
        fmt.Println(err)
    }
}

В этом примере определены две функции валидации - validateName() и validateEmail(). Каждая функция выполняет проверки для соответствующего поля и возвращает ошибку, если проверка не пройдена.

Это только некоторые примеры того, как можно реализовать валидацию данных в Go, и существует множество других подходов. Выбор подхода зависит от требований вашего проекта и вашего личного вкуса. Важно помнить о проверке данных перед их использованием, чтобы избежать ошибок и проблем с безопасностью.