#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:"-"
внимание, что проверка этого поля будет пропущена
====================================================================
Случай 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)
}
Комментарии:
1. Спасибо за примеры. Imho case1 не работает: если я оставлю Required . Значение пусто, оно все равно пройдет проверку, что неверно.
2. @andig вы пробовали это? работает для меня на игровой площадке
3. Извините. Должно быть, мой тест был ошибочным. Могу подтвердить, что это работает. Я также нашел обходной путь для проверки правил для необязательной структуры с помощью приемника указателя. тег «-«, похоже, не нужен: play.golang.org/p/sgvDL0oqN3l
4. Большое вам спасибо. Я потратил слишком много времени на то, как пропустить проверку во вложенной структуре. Используя предложенное вами решение, добавив validate:»-«, работает очень хорошо.