如何利用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
相关产品推荐
相关产品推荐

