Go: validace obsahu proměnných

Pokud od někud něco načítáte, a jste aspoň trochu defenzivně naladěný, pak určitě budete chtít validovat získaná, načtená data.

Vlastní cestou

Můžete začít třeba tím, že si budete psát nějakou vlastní funkcionalitu pro validaci a bude na vás kompletní logika a implementace. Třeba nějak takto, nebo nějak lépe:

type osoba struct {
	Jmeno    string 
	Prijmeni string
}

func osobaValidate(o osoba) error {
	if len(o.Jmeno) < 5 || len(o.Jmeno) > 10 {
		return fmt.Errorf("Jmeno je spatne: %s", o.Jmeno)
	}

	if len(o.Prijmeni) < 5 || len(o.Prijmeni) > 10 {
		return fmt.Errorf("Jmeno je spatne: %s", o.Jmeno)
	}

	return nil
}

Nebo to necháte na Go

A využijete balíčku validator, který vám s pomocí runtimové Go knihovny reflect poskytne vše potřebné a validaci vyřešíte mnohem komfortněji:

package main

import (
	"fmt"

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

type osoba struct {
	Jmeno    string `validate:"max=10,min=5"`
	Prijmeni string `validate:"max=10,min=5"`
}

func main() {
	pepa := osoba{
		Jmeno:    "p",
		Prijmeni: "p",
	}

	var validate *validator.Validate
	validate = validator.New()

	if err := validate.Struct(pepa); err != nil {
		fmt.Println(err)
	}

	fmt.Println(pepa)
}

Jediné co musíte udělat je dopsat validační pravidla do definice struktury. V kódu to pak vypadá pěkně, protože krom typvé definice přímo na jednom místě připojujete i pravidla pro samotný obsah. A ty mohou být mnohem složitější, než je jen kontrola délky.