我试图在Golang中编写一个正则表达式来验证字符串是否只有字母数字,句号和下划线。但是,我遇到了一个我以前从未见过但在Googling上失败的错误。
这是正则表达式:
pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
这是错误:
const initializer regexp.MustCompile("^[A-Za-z0-9_\\.]+") is not a constant
"不是常数"意思是如何解决这个问题? 感谢。
答案 0 :(得分:14)
这通常发生在您尝试分配具有不能保持不变的类型的包级变量时(例如,Regexp
)。只有int
,string
等基本类型才能保持不变。有关详细信息,请参阅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 := ...
}