首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在验证应仅接受已定义常量的自定义类型

正在验证应仅接受已定义常量的自定义类型
EN

Stack Overflow用户
提问于 2020-11-20 10:46:14
回答 1查看 64关注 0票数 0

下面是我拥有的代码

代码语言:javascript
复制
package main

import (
    "fmt"

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

type PriorityLevel string

const (
    high   PriorityLevel = "P1"
    medium PriorityLevel = "P2"
)

type OrdersPriority struct {
    OrderID  string        `json:"order_id" validate:"required"`
    Priority PriorityLevel `json:"priority" validate:"required"`
}

var validate *validator.Validate

func main() {
    order := OrdersPriority{
        OrderID:  "Order_1",
        Priority: "random_priority",
    }

    validate = validator.New()
    err := validate.Struct(order)
    fmt.Printf("%+v", err)
}

如您所见,我的PriorityLevel应该只有highmedium值。如何使用validator强制执行此操作?

我知道在validate标记中,我可以提供“可能的”值,但是这个选项是不可伸缩的,也就是说,如果我最终向该常量添加更多的值,我也必须在那里进行更改。使用这个validator库,有没有更多的Go方法可以做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-11-20 12:52:59

您可以使用eq并放入多个值,但以后将很难维护

代码语言:javascript
复制
package main

import (
    "fmt"
    v "github.com/go-playground/validator/v10"
)

type Abc struct {
    A string `validate:"required,eq=public|eq=private"`
}

func main() {
    fmt.Println("Hello, playground")
    a := Abc{
        A: "public",
    }
    b := Abc{
        A: "private",
    }
    c := Abc{
        A: "panda",
    }
    validator := v.New()
    err := validator.Struct(a)
    fmt.Printf("a %+v\n", err)
    err = validator.Struct(b)
    fmt.Printf("b %+v\n", err)
    err = validator.Struct(c)
    fmt.Printf("c %+v\n", err)
}

对于您的用例,最好使用自定义的验证器函数,例如

代码语言:javascript
复制
validate.RegisterValidation(`mycustomvalidator`, func(fl validator.FieldLevel) bool {
    str := fl.Param()
    //Now you can check your custom validation here
    return str == "abc"
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64923054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档