我使用的是https://github.com/go-playground/validator,我需要为不同的枚举值创建自定义验证规则.这是我的 struct --https://go.dev/play/p/UmR6YH6cvK9.正如你所看到的,我有3个不同的用户类型管理员,版主和内容创建者,我想为他们调整不同的密码规则.例如,管理员的密码长度应至少为7个符号,而版主至少应为5个符号.是否可以通过Go-Platform/Validator中的标签来实现这一点?

我的服务获取用户列表,需要使用不同的规则进行验证

推荐答案

您可以向UserType添加一个方法,该方法使用validator包来验证用户.

type UserType int

const (
    Admin UserType = iota
    Moderator
    ContentCreator
)

func (u UserType) Validate() error {
    switch u {
    case Admin:
        // validate admin
    case Moderator:
        // validate moderator
    case ContentCreator:
        // validate content creator
    default:
        return fmt.Errorf("invalid user type")
    }
    return nil
}

调用VALIDATE将如下所示

func main() {
    a := User{
        Type:         Admin,
        Name:         "admin",
        Password:     "pass",
        LastActivity: time.Time{},
    }

    err := a.Type.Validate()
    if err != nil {
        fmt.Println("invalid user: %w", err)
    }
}

Go相关问答推荐

如何在Deliverq中高效地传达客户依赖关系?

CGO如何转换为文件*类型

无法获取RPC描述符

使用反射在Go中递归迭代 struct 体和集合字段

xml.Unmarshal 不支持的类型 struct

为什么 net/http 不遵守超过 30 秒的超时持续时间?

如何使用 sync.WaitGroup 来执行所有的 goroutine?

判断不同 go map 类型中的重复键

枚举的 Golang 验证器自定义验证规则

fmt.Printf() 标志 '0' 不会被字符串忽略

Golang并发写入多个文件

为什么此代码在运行命令 error="exec: not started" 时出现错误?

如何在测试中使用自定义标志(使用`testify/suite`)

如何在Golang中的差异函数中杀死命令Exec

使用正则表达式拆分具有相同标题的数据块

是否可以使用按位运算在随机 unicode 字符串中找到重复字符?

在 Golang 中使用 OR 条件验证 struct 的两个字段

Golang 有类似 C++ 的 decltype 的东西吗?

如何在 Gorm 中获得特定日期的最大值?

如何在 Prometheus 中正确检测区域和环境信息?