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

jou*_*esm 11 regex go

我正在尝试在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)


edu*_*911 7

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

不要这样做:

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)


Mar*_*eed 6

在 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)