You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用go-playground/validator/v10结构体标签验证SettingsID格式?

解决方案

方法一:使用内置regexp标签直接验证

你可以直接利用validator的regexp标签,把允许的字符规则写成正则表达式嵌入标签里,这是最直接的方式。修改后的结构体如下:

type Config struct {
    SettingsID *string `mapstructure:"settingsId" validate:"required,regexp=^[a-z0-9_\\\\-]+$"`
}

说明:

  • ^[a-z0-9_\\\\-]+$ 这个正则的含义:
    • ^ 和 $ 确保整个字符串都符合规则,不会出现允许字符之外的内容
    • [a-z0-9_\\\\-] 定义了允许的字符:小写字母、数字、下划线、连字符、反斜杠(注意Go字符串标签里,反斜杠需要转义两次,也就是\\\\对应正则里的单个\)
    • + 表示字符串至少要有一个字符(配合required标签,已经确保字段非空,这里是进一步限制内容长度)

你之前尝试的lowercase,alphanum,containsany=_\\-组合无效的原因:

  • alphanum 规则只允许字母和数字,会直接排除_、-、\这些符号
  • containsany 是要求字符串必须包含指定符号中的至少一个,而不是允许包含,不符合你的需求

方法二:自定义验证器(可选)

如果不想用正则标签,也可以注册自定义验证函数:

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

func validateSettingsID(fl validator.FieldLevel) bool {
    str := fl.Field().String()
    for _, c := range str {
        switch {
        case c >= 'a' && c <= 'z':
            continue
        case c >= '0' && c <= '9':
            continue
        case c == '_' || c == '-' || c == '\\':
            continue
        default:
            return false
        }
    }
    return true
}

// 注册验证器
var validate *validator.Validate

func init() {
    validate = validator.New()
    validate.RegisterValidation("settingsid", validateSettingsID)
}

然后结构体标签改成:

type Config struct {
    SettingsID *string `mapstructure:"settingsId" validate:"required,settingsid"`
}

这种方式适合规则复杂、正则难以表达的场景,你的需求用正则标签就足够简洁。

内容的提问来源于stack exchange,提问作者RedCollarPanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:05:39