Входные данные о правильном использовании привязки: «требуется» в Golang struct - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть структура (с 1 полем, для упрощения), для которой данные поступают из другой функции.

Далее, для поля структуры я поставил binding: "required" , так как мне нужно, чтобы он был не пустым / существующим.

Код:

package main

import (
    "fmt"
    "encoding/json"
)

type Config struct {
    Name       string   `yaml:"name"    json:"name"     binding:"required"`
} 

func main() {
    var myConfig Config

    var rawConfig = []byte(`{}`)  // Empty, Nothing getting passed.

    err := json.Unmarshal(rawConfig, &myConfig)
        if err != nil {
          panic(err)
        }
    fmt.Printf("Name = %s\n", myConfig.Name)
}

Когда я запускаю это, даже если значение имени не было передано, оно проходит.

Вывод:

Name = 

Go детская площадка Кодовая ссылка: https://play.golang.org/p/zA6nij9vTvY

Я хочу добиться следующего:

  • Как я ожидаю Поле «Имя» должно присутствовать, что мне делать, чтобы оно не сработало, если оно отсутствует. Разве не ожидается, что unmarshalling будет использовать привязку = обязательный тег и потерпит неудачу?
  • Иначе, каков наилучший подход, чтобы выяснить, если обязательное поле отсутствует, чтобы мы потерпели неудачу?
  • Или это грубая ошибка? способ итерации по полям, и выяснить, если пусто, единственный способ?

1 Ответ

0 голосов
/ 25 апреля 2020

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

Или вы можете использовать доступные пакеты валидатора: https://github.com/dealancer/validate



    package main

    import (
        "encoding/json"
        "fmt"
        "gopkg.in/dealancer/validate.v2"
    )

    type Config struct {
        Name       string   `yaml:"name"    json:"name"     validate:"empty=false"`
    }

    func main() {
        var myConfig Config

        var rawConfig = []byte(`{}`)  // Empty, Nothing getting passed.

        err := json.Unmarshal(rawConfig, &myConfig)
        if err != nil {
            panic(err)
        }
        err = validate.Validate(myConfig)
        if err != nil {
            panic(err)
        }
        fmt.Printf("Name = %s\n", myConfig.Name)
    }


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...