Более чистый и идиоматический способ сделать это — использовать проверки структуры ❤
type Config struct {
ServerUrl string `json:"server_url" validate:"required"`
AppPort int `json:"app_port" validate:"required,numeric,gte=8080,lte=8085"`
}
Декларативен и ближе к определению структуры. Разве это не прекрасно!
Теперь наша функция проверки будет выглядеть примерно так:
func Validate(config Config) bool {
validate := validator.New()
err := validate.Struct(config)
if err != nil {
fmt.Println("Invalid config !", err.Error())
return false
}
return true
}
Кроме того, у нас могут быть более значимые ошибки, указывающие на неудачные проверки:
import "github.com/go-playground/validator/v10"
func Validate(config Config) bool {
validate := validator.New()
err := validate.Struct(config)
if err != nil {
fmt.Println("Invalid config !")
for _, validationErr := range err.(validator.ValidationErrors) {
fmt.Println(validationErr.StructNamespace() + " violated " + validationErr.Tag() + " validation.")
}
return false
}
return true
}
Окончательная суть будет выглядеть примерно так:
https://github.com/PankhudiB/go-config-validation/blob/main/main.go
Загляните в замечательную [библиотеку валидаторов] (https://github.com/go-playground/validator#baked-in-validations), чтобы найти больше таких тегов…
«Но, Панхуди, что, если мне нужно добавить свои собственные подтверждения?» 🤔 — спросите вы.
На это я отвечаю, перейдя в [следующий блог в серии…] https://medium.com/@psbhonsle08/go-custom-struct-validation-the-idiomatic-way-9e9e9d29bb6a.