正则表达式"不是常数" Golang中的错误

时间:2016-06-22 18:50:14

标签: regex go

我试图在Golang中编写一个正则表达式来验证字符串是否只有字母数字,句号和下划线。但是,我遇到了一个我以前从未见过但在Googling上失败的错误。

这是正则表达式:

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

这是错误:

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

"不是常数"意思是如何解决这个问题? 感谢。

3 个答案:

答案 0 :(得分:14)

这通常发生在您尝试分配具有不能保持不变的类型的包级变量时(例如,Regexp)。只有intstring等基本类型才能保持不变。有关详细信息,请参阅here

示例:

pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
// which translates to:
const pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)

您必须将其声明为var才能使其正常工作:

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

此外,我通常会说明变量被视为常量:

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

答案 1 :(得分:5)

错误很清楚。如果你想在全球范围内这样做......

不要这样做:

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)

答案 2 :(得分:4)

在Go声明上下文中,使用简单=进行赋值会创建常量,而不是变量。 (在声明之外,它是对必须已存在的变量的赋值。)

但是,常量初始化必须只包括常量 - 而不是regexp.MustCompile()之类的调用 - 所以pattern 在这种情况下不能成为常数,即使你不是我打算稍后改变它的价值。 (事实上​​,即使你能以某种方式初始化它而不调用任何东西,Regexp也不能成为Go中的常量;只有基本类型才可以。)

这意味着您需要将其置于var语句中,或者使用:=而不是=在函数内声明它,使其变为变量:

var (
   pattern = ...
)

var pattern = ...

func something() {
   pattern := ...
}