正则表达式“不是常量”编译错误

我正在尝试在 Go 中编写一个正则表达式来验证一个字符串是否只有字母数字、句点和下划线。但是,我遇到了一个我以前从未见过的错误,并且在谷歌搜索中没有成功。

这是正则表达式:

pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)

这是错误:

const initializer regexp.MustCompile("^[A-Za-z0-9_\\.]+") is not a constant

“不是常数”是什么意思,我该如何解决?


墨色风雨
浏览 205回答 3
3回答

开满天机

当您尝试分配一个类型不能为常量的常量(例如,Regexp)时,就会发生这种情况。只有基本类型 like int,string等可以是常量。有关更多详细信息,请参见此处。例子:pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)// which translates to:const pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)您必须将其声明为 avar才能正常工作:var pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)另外,我通常会放一个注释说变量被视为常量:var /* const */ pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)

紫衣仙女

错误很明显。如果您尝试在全球范围内执行此操作...不要这样做:const pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)而是这样做:var pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)或者,如果您真的希望模式保持不变:const pattern = `^[A-Za-z0-9_\.]+` var alphaNum = regexp.MustCompile(pattern)

繁华开满天机

在 Go 声明上下文中,使用简单的赋值=创建一个常量,而不是变量。(在声明之外,它是对必须已经存在的变量的赋值。)但是一个常量初始化必须只包含常量——而不是像这样的调用regexp.MustCompile()——所以在这种情况下pattern 不能是一个常量,即使你以后不打算改变它的值。(事实上,即使你可以在不调用任何东西的情况下以某种方式初始化它,aRegexp也不能是 Go 中的常量;只有基本类型可以。)var这意味着您需要通过将其放在语句中或在函数中声明它来使其成为变量,:=而不是=:var (   pattern = ...)或者var pattern = ...或者func something() {   pattern := ...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go