Более чистый и идиоматический способ сделать это — использовать проверки структуры

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.