Как go-validator может проверять поля на их нулевое значение?

#validation #go

#проверка #Вперед

Вопрос:

Я пытаюсь использовать https://github.com/go-playground/validator и необходимо убедиться, что конфигурация пользователя имеет заполненную внутреннюю структуру (т. Е. Не Нулевую), в то же время допуская необязательную конфигурацию:

 type Config struct {
    Required Setting `validate:"required"`
    Optional Setting
}

type Setting struct {
    Val string
}
  

См . https://play.golang.org/p/P_6qY7H64sO на детской площадке.

Другими словами: могу ли я сделать поле, содержащее вложенную структуру, требуемым с точки зрения правил проверки, запускаемых для вложенной структуры, при этом другое поле с тем же типом вложенной структуры необязательно?

Структура необязательного поля все равно должна быть проверена, если какое-либо из его полей не равно нулю (т. Е. необязательное поле заполнено и, следовательно, нуждается в проверке).

Обновление Я заметил structonly тег, но документы отрывочны, и я не могу заставить его работать, как описано выше.

Комментарии:

1. Автоматическое нулевое значение неотличимо от точно такого же значения, которое было задано явно.

2. … что должно привести к ошибке, однако игровая площадка этого не делает.

3. @andig Я добавил подход, посмотрим, поможет ли это

Ответ №1:

Случай 1, если вы хотите пропустить необязательную структуру

Я думаю, вам это нужно

 package main

import (
    "fmt"

    "github.com/go-playground/validator"
)

// Config : Config Struct
type Config struct {
    Required Setting
    Optional Setting `validate:"-"`
}

// Setting : Setting Struct
type Setting struct {
    Val string `validate:"required"`
}

func main() {
    val1 := Config{
        Required: Setting{Val: "Hello"},
    }
    val2 := Config{
        Optional: Setting{Val: "Hello"},
    }

    validate := validator.New()
    err := validate.Struct(val1)
    fmt.Println(err)

    err = validate.Struct(val2)
    fmt.Println(err)
}
  

Обратите validate:"-" внимание, что проверка этого поля будет пропущена

Go Playground

====================================================================

Случай 2, если вы хотите выполнить дополнительную проверку в разных случаях

Или, если вы хотите разные проверки в разных условиях, используя ту же структуру

вы можете создать второй валидатор с другим тегом следующим образом

 package main

import (
    "fmt"

    "github.com/go-playground/validator"
)

// Config : Config Struct
type Config struct {
    Required Setting
    Optional Setting
}

// Setting : Setting Struct
type Setting struct {
    Val string `validate:"required" valid:"omitempty,len=5"`  //<---- See This
}

func main() {
    val1 := Config{
        Required: Setting{Val: "Hello"},
    }
    val2 := Config{
        Optional: Setting{Val: "Hello"},
    }

    validate := validator.New()
    err := validate.Struct(val1)
    fmt.Println(err)

    err = validate.Struct(val2)
    fmt.Println(err)

    fmt.Println("Second Validator")
    // New Validator
    validate2 := validator.New()

    validate2.SetTagName("valid") //<---- See This
    err = validate2.Struct(val1)
    fmt.Println(err)

    val1.Optional.Val = "Hel"
    err = validate2.Struct(val1)
    fmt.Println(val1, err)

    val1.Optional.Val = "Hello"
    err = validate2.Struct(val1)
    fmt.Println(val1, err)

}
  

Go Playground

Комментарии:

1. Спасибо за примеры. Imho case1 не работает: если я оставлю Required . Значение пусто, оно все равно пройдет проверку, что неверно.

2. @andig вы пробовали это? работает для меня на игровой площадке

3. Извините. Должно быть, мой тест был ошибочным. Могу подтвердить, что это работает. Я также нашел обходной путь для проверки правил для необязательной структуры с помощью приемника указателя. тег «-«, похоже, не нужен: play.golang.org/p/sgvDL0oqN3l

4. Большое вам спасибо. Я потратил слишком много времени на то, как пропустить проверку во вложенной структуре. Используя предложенное вами решение, добавив validate:»-«, работает очень хорошо.