我正在尝试在Golang中编写一个正则表达式来验证字符串是否只有字母数字,句点和下划线.但是,我遇到了一个我以前没有见过的错误,并且在Googling上没有成功.
这是正则表达式:
pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
Run Code Online (Sandbox Code Playgroud)
这是错误:
const initializer regexp.MustCompile("^[A-Za-z0-9_\\.]+") is not a constant
Run Code Online (Sandbox Code Playgroud)
什么"不是常数"是什么意思,我该如何解决这个问题?
谢谢.
rob*_*rit 17
当您尝试分配具有不能为常量的类型的包级变量时(例如,Regexp),通常会发生这种情况.只有基本类型喜欢int,string等等可以是不变的.有关详细信息,请参见此处
例:
pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
// which translates to:
const pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
Run Code Online (Sandbox Code Playgroud)
你必须声明它是一个var工作:
var pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
Run Code Online (Sandbox Code Playgroud)
另外,我通常会说明变量被视为常量:
var /* const */ pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
Run Code Online (Sandbox Code Playgroud)
错误很清楚.如果你想在全球范围内这样做......
不要这样做:
const pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
Run Code Online (Sandbox Code Playgroud)
相反:
var pattern = regexp.MustCompile(`^[A-Za-z0-9_\.]+`)
Run Code Online (Sandbox Code Playgroud)
或者如果你真的希望模式保持不变:
const pattern = `^[A-Za-z0-9_\.]+`
var alphaNum = regexp.MustCompile(pattern)
Run Code Online (Sandbox Code Playgroud)
在 Go 声明上下文中,简单的赋值=会创建一个常量,而不是变量。(在声明之外,它是对必须已经存在的变量的赋值。)
但是常量初始化必须仅包含常量 - 而不是类似的调用regexp.MustCompile()- 因此在这种情况下pattern 不能是常量,即使您不打算稍后更改其值。(事实上,即使你可以在不调用任何东西的情况下以某种方式初始化它,aRegexp也不能是 Go 中的常量;只有基本类型可以。)
这意味着您需要通过将其放入语句中或使用而不是var在函数中声明它来使其成为变量::==
var (
pattern = ...
)
Run Code Online (Sandbox Code Playgroud)
或者
var pattern = ...
Run Code Online (Sandbox Code Playgroud)
或者
func something() {
pattern := ...
}
Run Code Online (Sandbox Code Playgroud)